画像のURLはコンソールに出力されますが、src属性にレンダリングされません。非同期でこれを達成し、vuejsで待つ方法は?
<div v-for="(data, key) in imgURL" :key="key">
<img :src= "getLink(data)" />
</div>
ここで、imgURLはファイル名を含み、ファイル名のコレクションです。
methods: {
async getLink(url){
let response = await PostsService.downloadURL({
imgURL : url
})
console.log(response.data)
return response.data
}
}
AxiosでバックエンドからURLを取得しています。
これは不可能です。値からDOMを作成/更新するプロセスは同期プロセスです。そのため、Vue.jsはgetLink
から返された値/オブジェクトをそのまま使用します。この場合、Promiseオブジェクトになります。
問題を解決するには、それらの画像用に独自のコンポーネントを作成する必要があります。そのコンポーネントの作成されたコールバックでgetLink
を呼び出し、getLink
メソッドでデータを受信するとすぐにデータlink
を設定します。再レンダリングをトリガーします。
created() {
// when the instance ist create call the method
this.getLink();
},
methods: {
async getLink(){
let response = await PostsService.downloadURL({
imgURL : this.url
})
console.log(response.data)
this.link = response.data
}
}
画像コンポーネントのテンプレートでは、次のようになります。
<img :src= "link">
これで、画像コンポーネントを拡張して、読み込みインジケータなどを含めることができます。
Vue.component('my-image-component', {
props: {
url: {type:String, required: true}
},
data : function() {
return {link : 'loading'}
},
template: '<div>{{ link }} </div>',
created() {
this.getLink();
},
methods: {
getLink() {
setTimeout(() => {
this.link = 'response url for link: ' + this.url
}, 1000)
}
}
})
new Vue({
el: '#app',
data: {
"imgURL": {
test1: "1234",
test2: "5678"
}
}
})
<div id="app">
<div v-for="(data, key) in imgURL" :key="key">
<my-image-component :url="data"></my-image-component>
</div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js" type="text/javascript" charset="utf-8"></script>