如何异步加载vuejs中的图像src url?

时间:2018-06-02 17:58:09

标签: javascript html webpack vue.js async-await

图片网址在控制台中打印但未呈现为src属性。如何在vuejs中使用async和await来实现这一点?

<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。

1 个答案:

答案 0 :(得分:5)

这种方式不可能,从值创建/更新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">

您确定现在可以扩展该图像组件以包含加载指示符或类似的内容。

&#13;
&#13;
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"
    }
  }
})
&#13;
<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>
&#13;
&#13;
&#13;