Img не загружается из: src

Я получаю местоположение изображения из firestore и хочу показать изображение с помощью v-bind: src. Вы можете найти мой код ниже:

<b-avatar v-bind:src = "profilepic" class = "mr-5" size = "8em"></b-avatar>

мои методы можно найти ниже:

export default {
    data() {
        return {
            uid: "",
            profilepic: "",
        }
    },
    methods: {
        getprofilepic() {
            fb.storage().ref('users/' + this.uid + '/profile.jpg').getDownloadURL().then(imgURL  => {
                this.profilepic = imgURL;
                alert(this.profilepic); // shows the correct path
            })
        },
    }


    created() {
        this.uid = fb.auth().currentUser.uid;
        this.getprofilepic();
    }

}

Я уверен, что this.profilepic сохраняет правильный путь, как если бы я вручную вводил путь, он будет отображаться. Я подозреваю, что страница загружалась до того, как путь можно было получить из firestore. Как я могу обойти это? Заранее спасибо.

Я пробовал жестко закодировать путь непосредственно к данным, и он отлично работает. Код можно найти ниже:

 data() {
        return {
            uid: "",
            profilepic: "*my firebase storage path*",
        }
    },

С этим я не совсем уверен, почему он все еще не отображается

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
53
3

Ответы 3

Попробуйте дождаться получения uuid:

<template>
  <img height = "200" v-bind:src = "profilepic" />
</template>

<script>
export default {
  data() {
    return {
      uuid: undefined,
      profilepic: undefined
    }
  },
  methods: {
    getprofilepic() {
      fb.storage().ref('users/' + this.uid + '/profile.jpg').getDownloadURL()
        .then(imgURL  => {
        this.profilepic = imgURL;
      })
    },
    getuuid(){
      return new Promise((resolve, reject) => {
        var user = fb.auth().currentUser;
        if (user == null) reject()
        if (user) resolve(user.uid)
      })
    }
  },
  created() {
    this.getuuid()
      .then(uuid => this.uuid = uuid)
      .then(() => {
      this.getprofilepic();
    })
  }
};
</script>

Как вы можете видеть в этом примере, не имеет значения, сколько времени требуется для загрузки URL: Игровая площадка Vue SFC

хм, я пробовал использовать ваш метод, но он работает. Я думаю, что это больше связано с ожиданием получения пути к хранилищу firebase перед загрузкой экрана. Есть способ сделать это? Благодарность!

Samuel 07.04.2021 08:44

Это не должно быть проблемой. Но вы можете попробовать привязать v-if к profilepic на <b-avatar> вот так: v-if = "profilepic.length > 0"

tauzN 07.04.2021 11:27

Я обновил ответ примером, в котором загрузка изображения без проблем занимает 1 секунду. Тег img обновляется при изменении данных.

tauzN 07.04.2021 11:32

В скрипте под тегами шаблона вы должны обязательно включить изображение и, конечно же, вместо того, чтобы указывать мой путь, укажите путь к вашему изображению!

<script>
    export default {
        data() {
            return {
                files: {
                    my_pic: require('/src/assets/img/avatars/logo.png')
                }
            };
        },
       }
     };
 </script>

Затем в вашем и куда вы хотите поместить свое изображение, вам нужно поместить его в этом формате

 <img :src = "files.my_pic">

Дайте мне знать, поможет ли это или вы хотите, чтобы я расширился.

Привет @Maria, большое спасибо за помощь. Однако я все еще не могу решить эту проблему, хотя считаю, что ваше решение может быть правильным. Поскольку я использую firestore для получения пути к изображению, мне пришлось сделать это вместо этого, но он все еще не работал: <b-avatar v-bind: src = "'require (' + profilepic + ')'" id = " profilepic "> </b-avatar>

Samuel 07.04.2021 08:53

Когда Vue Loader компилирует блоки <template> в SFC, он также преобразует любые встречающиеся URL-адреса ресурсов в запросы модуля webpack.

Например, следующий фрагмент шаблона:

<img src = "../image.png">

будет скомпилирован в:

createElement('img', {
 attrs: {
  src: require('../image.png') // this is now a module request
 }
})

По умолчанию следующие комбинации тегов / атрибутов преобразуются, и их можно настроить с помощью опции transformAssetUrls.

{
  video: ['src', 'poster'],
  source: 'src',
  img: 'src',
  image: ['xlink:href', 'href'],
  use: ['xlink:href', 'href']
}

Шаг 1: Создать vue.config.js

 module.exports = {
  productionSourceMap: false,
  chainWebpack: config => {
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options['transformAssetUrls'] = {
          video: ['src', 'poster'],
          source: 'src',
          img: 'src',
          image: 'xlink:href',
          'b-avatar': 'src',
          'b-img': 'src',
          'b-img-lazy': ['src', 'blank-src'],
          'b-card': 'img-src',
          'b-card-img': 'src',
          'b-card-img-lazy': ['src', 'blank-src'],
          'b-carousel-slide': 'img-src',
          'b-embed': 'src'
        }
        return options
      })
  }
}

Шаг 2: Внутри main.js импорт vue.config

import '../vue.config'

Шаг 3: Создайте свой шаблон html

<template>
  <b-avatar :src = "profilepic" class = "mr-5" size = "8em"></b-avatar>
</template>
<script>
  import { BAvatar } from 'bootstrap-vue'
  export default {
    name: 'bootstrap-image-avatar',
    components: {
      'b-avatar': BAvatar
    },
    data() {
      return {
        uid: "",
        profilepic: "",
      }
    },
    methods: {
      getprofilepic() {
        fb.storage().ref('users/' + this.uid + '/profile.jpg').getDownloadURL().then(imgURL  => {
          this.profilepic = imgURL;
          alert(this.profilepic); // shows the correct path
        })
      },
    }
    created() {
      this.uid = fb.auth().currentUser.uid;
      this.getprofilepic();
    }
  }
</script>

@Samuel Надеюсь, это поможет вам. Попробуй и дай мне знать.

Jebasuthan 07.04.2021 20:00

Привет, Джебасутан, спасибо за очень подробное объяснение. Я пробовал ваше решение, но оно все еще не работает. Я пробовал жестко закодировать путь прямо в данные ... например, profilepic: "firebase storage path" и используйте v-bind: src = "profilepic", и он работает .. Итак, я считаю, что проблема больше в хранилище? Я тоже не совсем уверен.

Samuel 07.04.2021 20:22

Привет, @Jebasuthan, я обнаружил ошибку, но не совсем уверен, как ее обойти. Я опубликовал обновленную проблему для ясности. Ссылку можно найти здесь: stackoverflow.com/questions/66998550/…

Samuel 08.04.2021 09:49

Другие вопросы по теме