Vue.js 动态图像不起作用

IT技术 javascript html vue.js vuejs2
2021-01-30 18:40:26

我有一个案例,在我Vue.jswebpack网络应用程序中,我需要显示动态图像。我想显示img图像的文件名存储在变量中的位置。该变量是一个computed返回Vuex存储变量属性,该变量在 上异步填充beforeMount

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

但是,当我这样做时它可以完美运行:

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

我的情况类似于这个fiddle,但在这里它适用于 img URL,但在我的实际文件路径中,它不起作用。

正确的做法应该是什么?

6个回答

我通过以下代码得到了这个工作

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

并在 HTML 中:

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

但不确定为什么我之前的方法不起作用。

问题是路径不存在。整个 vue 应用程序被 webpack 编译成一个脚本(并且图像也正常重命名,使用内容的散列)。使用 require.context,您可以强制 webpack 看到这些文件并解析为结果图像。检查浏览器中的工作链接,您就会明白我的意思。很好的解决方案。
2021-03-17 18:40:26
根据 nickmessing 的说法:“v-bind 中的表达式在运行时执行,webpack 别名在编译时执行。” github.com/vuejs/vue-loader/issues/896
2021-03-27 18:40:26
@Grigio 对此答案有很好的改进:stackoverflow.com/a/47480286/5948587
2021-03-27 18:40:26
你好,我试过这个但失败了,然后我找到了另一个使用模板文字的解决方案。它可以工作,我想分享这个:stackoverflow.com/questions/57349167/...
2021-04-03 18:40:26
如果我不希望我的图像出现在资产文件夹中怎么办?如果它们仅存在于网站的公共文件夹中,因为它们是由管理区域的用户上传的,该怎么办?
2021-04-05 18:40:26

这是 webpack 将使用的速记,因此您不必使用require.context.

HTML:

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

方法:

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

我发现这里的前两段解释了为什么会这样?好。

请注意,将您的宠物图片放在子目录中是个好主意,而不是将其与所有其他图像资产一起放入。像这样:./assets/pets/

这里每个答案的秘密都../assetsrequire方法中,请查看stackoverflow.com/questions/57349167/...了解更多详情
2021-03-18 18:40:26
` <v-img :src="require( @/assets/+ items.image)" height="200px"></v-img>` 这个也解决了问题
2021-03-19 18:40:26
这是经过大量尝试后唯一可行的解​​决方案。
2021-03-27 18:40:26
这是唯一对我有用的解决方案
2021-04-01 18:40:26

你可以试试这个require功能。像这样:

<img :src="require(`@/xxx/${name}.png`)" alt class="icon" />

@符号指向src目录。

来源:Vue URL 转换规则

为什么@需要那个符号?
2021-03-16 18:40:26
@符号不是必需的,它通常代表您src在使用Resolve目录| webpack(vue-cli 已经配置了这个。)。
2021-04-09 18:40:26

还有另一种方法是将图像文件添加到公共文件夹而不是资产并将其作为静态图像访问。

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

这是您需要放置静态图像的地方:

在此处输入图片说明

这对我有用,除了我省略了 v-bind 的 alt 标签
2021-03-14 18:40:26
我认为这是要走的路,而不是资产文件夹。
2021-03-16 18:40:26
在最新的 Vue2 中,动态要求对我也不起作用
2021-03-22 18:40:26
为我省去了很多痛苦,我遇到了奇怪的错误:使用 require 找不到module './undefined',谢谢
2021-04-04 18:40:26

最好的办法是使用一种简单的方法为给定索引处的图像构建正确的字符串:

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

然后在您的内部执行以下操作v-for

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

这是 JSFiddle(显然图像没有显示,所以我把图像放在图像src旁边):

https://jsfiddle.net/q2rzssxr/

不知道为什么,我通过我在另一个答案中编写的代码让它工作。您的示例甚至可以在没有此功能的情况下工作,请参见此处:jsfiddle.net/9a6Lg2vd/1
2021-03-15 18:40:26
真的吗?这是一个看起来工作正常的真实图像示例:jsfiddle.net/q2rzssxr/1
2021-03-24 18:40:26
就我而言,图片是使用 Vuex 存储异步填充的,可能与此有关,我尝试模拟它,但没有奏效:jsfiddle.net/9a6Lg2vd/2
2021-03-30 18:40:26
我的情况更像是这样一个:jsfiddle.net/9a6Lg2vd/4,但在我的本地宠物中,从 ajax 调用中获取数据,但图像没有得到渲染。
2021-03-30 18:40:26
这也有效:jsfiddle.net/9a6Lg2vd/5,不知道为什么它不能处理文件路径。
2021-04-03 18:40:26