Как загрузить изображение src url в vuejs асинхронно? - PullRequest
0 голосов
/ 02 июня 2018

URL-адрес изображения печатается в консоли, но не отображается в атрибуте src.Как добиться этого с помощью async и await в 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
     }
  }

Я получаю URL-адрес с бэкэнда сВардар.

1 Ответ

0 голосов
/ 03 июня 2018

Это невозможно, процесс создания / обновления 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...