145 votes

Les images dynamiques de Vue.js ne fonctionnent pas

J'ai un cas où, dans mon Vue.js con webpack J'ai besoin d'afficher des images dynamiques. Je veux afficher img où les noms de fichiers des images sont stockés dans une variable. Cette variable est un computed qui renvoie un Vuex qui est alimentée de manière asynchrone sur le site de l'entreprise. beforeMount .

<div class="col-lg-2" v-for="pic in pics">
   <img v-bind:src="'../assets/' + pic + '.png'" v-bind:alt="pic">
</div>

Cependant, cela fonctionne parfaitement quand je le fais :

<img src="../assets/dog.png" alt="dog">

Mon cas est similaire à celui-ci violon Mais ici, cela fonctionne avec l'URL de l'image, alors que dans le mien, avec les chemins de fichiers réels, cela ne fonctionne pas.

Quelle est la meilleure façon de procéder ?

2 votes

résolu ` <v-img :src="require( @/assets/ + items.image)" height="200px"></v-img>` celui-ci a aussi résolu le problème

132voto

Saurabh Points 29563

J'ai réussi à le faire fonctionner avec le code suivant

  getImgUrl(pet) {
    var images = require.context('../assets/', false, /\.png$/)
    return images('./' + pet + ".png")
  }

et en HTML :

<div class="col-lg-2" v-for="pic in pics">
   <img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>

Mais je ne sais pas pourquoi mon approche précédente n'a pas fonctionné.

8 votes

Selon nickmessing : "L'expression dans v-bind est exécutée au moment de l'exécution, les alias de webpack au moment de la compilation." github.com/vuejs/vue-loader/issues/896

0 votes

@Grigio a une belle amélioration de cette réponse : stackoverflow.com/a/47480286/5948587

2 votes

Le problème était que le chemin n'existe pas. Toute l'application vue est compilée par webpack en un seul script (et les images sont aussi renommées normalement, en utilisant un hash du contenu). En utilisant require.context, vous forcez les fichiers à être vus par webpack et à se résoudre à l'image résultante. Vérifiez le lien fonctionnel dans le navigateur et vous verrez ce que je veux dire. Excellente solution.

128voto

Grigio Points 1188

Voici un raccourci que webpack utilisera pour que vous n'ayez pas à utiliser require.context .

HTML :

<div class="col-lg-2" v-for="pic in pics">
    <img :src="getImgUrl(pic)" v-bind:alt="pic">
</div>

Méthode Vue :

getImgUrl(pic) {
    return require('../assets/'+pic)
}

Et je trouve que les 2 premiers paragraphes dans aquí expliquer pourquoi cela fonctionne-t-il ? bien.

Veuillez noter qu'il est préférable de placer les photos de vos animaux dans un sous-répertoire, plutôt que de les placer avec toutes vos autres images. Par exemple : ./assets/pets/

0 votes

` <v-img :src="require( @/assets/ + items.image)" height="200px"></v-img>` celui-ci a aussi résolu le problème

0 votes

C'était la seule solution qui fonctionnait après beaucoup d'essais

0 votes

Le secret de chaque réponse ici est qu'elles ont ../assets dans le require méthode, contrôle stackoverflow.com/questions/57349167/ pour plus de détails

30voto

Rukshan Dangalla Points 750

Il existe un autre moyen de le faire en ajoutant vos fichiers d'images au dossier public au lieu des actifs et en y accédant en tant qu'images statiques.

<img :src="'/img/' + pic + '.png'" v-bind:alt="pic" >

C'est ici que vous devez placer vos images statiques :

enter image description here

0 votes

Cela a fonctionné pour moi, sauf pour la balise alt, j'ai omis le v-bind.

1 votes

M'a épargné beaucoup de peine, j'ai obtenu une étrange erreur : Impossible de trouver le module './undefined' en utilisant require, merci.

1 votes

Je pense que c'est la voie à suivre, et non le dossier des actifs.

9voto

craig_h Points 14240

Votre meilleure chance est d'utiliser une méthode simple pour construire la chaîne de caractères correcte pour l'image à l'index donné :

methods: {
  getPic(index) {
    return '../assets/' + this.pics[index] + '.png';
  }
}

puis faites ce qui suit dans votre v-for :

<div class="col-lg-2" v-for="(pic, index) in pics">
   <img :src="getPic(index)" v-bind:alt="pic">
</div>

Voici le JSFiddle (évidemment les images ne s'affichent pas, j'ai donc mis l'image src à côté de l'image) :

https://jsfiddle.net/q2rzssxr/

0 votes

Vraiment ? Voici un exemple avec des images réelles qui semble fonctionner correctement : jsfiddle.net/q2rzssxr/1

0 votes

Je ne sais pas pourquoi, je l'ai fait fonctionner avec le code que j'ai écrit dans une autre réponse. Votre exemple fonctionne même sans cette fonction, voir ici : jsfiddle.net/9a6Lg2vd/1

0 votes

Dans mon cas, les pics sont remplis de manière asynchrone en utilisant Vuex store, peut-être que cela a quelque chose à voir avec cela, j'ai essayé de le simuler, mais cela n'a pas fonctionné : jsfiddle.net/9a6Lg2vd/2

-1voto

perun10 Points 1

Essayez d'importer l'image comme ceci, car Webpack devrait connaître sa dépendance.

    <ul>
              <li v-for="social in socials" 
              v-bind:key="social.socialId"
              >

                <a :href="social.socialWeb" target="_blank">
                  <img class="img-fill" :id="social.socialId" :src="social.socialLink" :alt="social.socialName">
                </a>
              </li>

            </ul>

<script>
        import Image1 from '@/assets/images/social/twitter.svg'
        import Image2 from '@/assets/images/social/facebook.svg'
        import Image3 from '@/assets/images/social/rss.svg'
        export default {
          data(){
            return{
              socials:[{         
                   socialId:1,         
                   socialName: "twitter",
                   socialLink: Image1,
                   socialWeb: "http://twitter.com"
              },
      {
          socialId:2,
          socialName: "facebook",
           socialLink: Image2,
           socialWeb: "http://facebook.com"

      },
      {
          socialId:3,
          socialName: "rss",
           socialLink: Image3,
           socialWeb: "http://rss.com"
      }]

 </script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X