REST APIから画像コレクションを取得するために Vue Resource を使用しています。リクエストは、私のVueコンポーネントのcreated
フックで送信されます。
問題は、取得したデータにmounted
フックでアクセスしようとしていますが、データがロードされていないことです。
コンソールにこのエラーが表示されます:
[Vue warn]:マウントされたフックのエラー:「TypeError:未定義のプロパティ 'forEach'を読み取れません」
これが私のコンポーネントです:
<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>
setTimeout
のコンテンツをmounted
で囲むと、すべてが正常に機能します。
そのため、mounted
フックが実行される前にデータが読み込まれるのを待つ方法がわかりません。これはVueライフサイクルフックの役割ではありませんか?
this.imgs.query()
呼び出しは非同期であるため、mounted
ハンドラーがthis.imgs
を設定する前にthen
フックが呼び出されています(これはv-for
をテンプレートの属性にref="image"
で追加します。そのため、コンポーネントがDOMにマウントされていても、$refs
はまだセットアップされていません。
「imgsで何かを行う」メソッドを作成し、非同期呼び出しのthen
ハンドラーの $nextTick
callback でそのメソッドを呼び出します。 $nextTick
に渡されたコールバックは「次のDOM更新サイクルの後に実行」されます。つまり、その時点で$refs
がセットアップされます。
<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>
ライフサイクル図 of Vue instance。Mounted Hook(つまり、DOMにアクセスできることを意味します)の後に、beforeUpdateフックと更新フックがあります。これらのフックはデータが変更されたときに使用されるbeforeCreateまたはupdateフックは、作成されたフックでデータを取得した後に使用できると思います。
<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);
});
},
// here we can use beforeUpdate or updated hook instead of mounted
beforeUpdate() {
// get the ref="image" in my dom template
let imgs = this.$refs.image;
imgs.forEach((img) => {
// I do some stuff with imgs
});
}
}
これがお役に立てば幸いです。
私は、VueJSと最近学習していることを思い出します)。