目标
我想将一张图片的路径作为prop传递给一个组件。我希望这个组件使用这个prop来动态生成背景图片。
我的所有图片都在Vue src文件夹中的assets文件夹中。 路径看起来像这样'@/assets/images/subject/computers.jpeg'
问题
没有出现背景图片
这是页面上呈现的内容:
然而,什么也没有显示出来
奇怪的行为
由于某种原因,在CSS中添加完全相同的路径名'@/assets/images/subject/computers.jpeg'有效(将其添加到<style>标签中)。 如果它是v-bind内联样式,则不起作用。
这是我的CSS中的样子
然而,这个问题是它不是动态呈现的CSS。
我进一步检查了元素并注意到一些奇怪的行为。正如您所看到的,内联样式将图像路径读取为'@/assets/images/subject/computers.jpeg'(下面图像中的element.style)。
而在CSS中添加路径,则将'@/assets/images/subject/computers.jpeg'更改为'http://localhost:8080/img/computers.7f3748eb.jpeg',然后正确呈现背景图像。
问题
我想我的问题有两个方面:
- 如何使用props在Vue中动态渲染背景图片?或者有更好的方法吗?
- 为什么绑定内联样式不能解析路径(仍然使用“@”),而直接添加到<script>标签中可以解析路径?
解决方案
好的,非常感谢tao和Bernard Borg帮助我理解这个问题。
我能够使用计算属性来解决这个问题,就像这样:
const imgSrc = computed(() => require(`@/assets/images/subject/${props.subject.image}`))
由于Vue默认使用的VueLoader解析路径的方式,我无法将“@”路径存储在prop本身中。相反,prop只是图像/文件名称(例如“computers.jpeg”),并且使用require()处理计算属性以解析前置路径到图像。
随后,我将计算属性添加到我的绑定内联样式中,如下所示:
<div class="subject-wrapper" v-bind:style="{ backgroundImage: `url('${imgSrc}')` }">
哇!它终于可以工作了。
简短概述
只需将图像/文件名称作为属性传递,并在计算属性中使用require()添加路径前缀即可。
干杯!