2017-12-08 9 views
1

Ich verwende Vue Resource, um eine Bildersammlung von einer REST-API abzurufen. Die Anfrage wird im created Hook meiner Vue-Komponente gesendet.Mounted-Methode wird ausgelöst, bevor Daten geladen werden - VueJS

Das Problem ist, ich versuche, auf die abgerufenen Daten im mounted Hook zuzugreifen, aber die Daten werden nicht geladen.

ich diesen Fehler in der Konsole:

[Vue warn]: Error in mounted hook: "TypeError: Cannot read property 'forEach' of undefined"

Hier ist meine Komponente:

<script> 
export default { 
    data() { 
    return { imgs : '' }; 
    }, 
    created() { 
    // the full url is declare in my main.js 
    this.imgs = this.$resource('acf/v3/pages/4'); 

    this.imgs.query().then((response) => { 
     console.log('success', response); 
     this.imgs = response.data.acf.gallery; 
    }, (response) => { 
     console.log('erreur', response); 
    }); 
    }, 
    mounted() { 
    // get the ref="image" in my dom template 
    let imgs = this.$refs.image; 

    imgs.forEach((img) => { 
     // I do some stuff with imgs 
    }); 
    } 
} 
</script> 

Wenn ich einen setTimeout um den Inhalt von mounted wickeln, funktioniert alles einwandfrei.

So verstehe ich nicht, wie ich warten kann, bis meine Daten geladen werden, bevor der mounted Hook ausgeführt wird. Ist das nicht die Rolle der Vue-Lebenszyklus-Hooks?

+0

warum verwenden Sie nicht einfach created()? – samayo

+0

Weil in 'created' nichts reaktiv ist. Sie können das DOM nicht vor dem angehängten Hook manipulieren. [Lesen Sie diese Dokumentation] (https://alligator.io/vuejs/component-lifecycle/). Und das ist genau das gleiche Problem, wenn ich nur einen lifeCycle Haken benutze. Mein Inhalt wird nicht geladen, wenn ich ihn verwenden möchte. – BrownBe

Antwort

2

Da der this.imgs.query() Anruf async, Ihre mounted Hook aufgerufen wird, bevor der then Handler this.imgs setzt (was ich nehme an, dass mit einem Attribute ref="image" mit v-for auf ein Element in der Vorlage gebunden zu sein). Obwohl die Komponente bereits im DOM gemountet wurde, wurde die $refs noch nicht eingerichtet.

Ich würde eine Methode machen, "etwas mit imgs tun" und dann diese Methode in einer $nextTick callback in der then Handler des Async-Aufrufs aufrufen. Der Rückruf, der an $nextTick übergeben wurde, wird "nach dem nächsten DOM-Aktualisierungszyklus ausgeführt", was bedeutet, dass der $refs an diesem Punkt eingerichtet wird.

<script> 
export default { 
    data() { 
    return { imgs: '' }; 
    }, 
    created() { 
    // the full url is declare in my main.js 
    this.imgs = this.$resource('acf/v3/pages/4'); 

    this.imgs.query().then((response) => { 
     console.log('success', response); 
     this.imgs = response.data.acf.gallery; 
     this.$nextTick(() => this.doStuffWithImgs()); 
    }, (response) => { 
     console.log('erreur', response); 
    }); 
    }, 
    methods: { 
    doStuffWithImgs() { 
     // get the ref="image" in my dom template 
     let imgs = this.$refs.image; 

     imgs.forEach((img) => { 
     // I do some stuff with imgs 
     }); 
    } 
    } 
} 
</script> 
+0

Ich wusste [$ nextTick] nicht (https://fr.vuejs.org/v2/api/index.html#Vue-nextTick). Danke, es funktioniert wie erwartet. – BrownBe

Verwandte Themen