You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue 3中如何为img的src绑定动态名称的本地图片文件

Vue动态绑定本地图片src失效解决方案

核心原因

Vue配套的打包工具(Vite/Webpack)只会对静态写死的src路径做资源预处理:public目录的路径会直接映射到部署根路径,assets目录的资源会被编译加哈希、转base64等。动态拼接的字符串路径不会被预处理,所以运行时路径和打包后的实际资源路径不匹配,导致加载失败。

解决方案分两种场景

场景1:图片存放在public目录

public目录的资源会被原封不动复制到打包后的根路径,不需要加任何前缀,直接拼接文件名即可:

<!-- 假设product.img为图片文件名,如goods.png -->
<img :src="`/${product.img}`" />

场景2:图片存放在src/assets目录

assets下的资源会被打包工具编译处理,动态引用需要用对应的工具语法让打包工具识别资源:

  • Vite环境适用写法

<img :src="new URL(`../assets/${product.img}`, import.meta.url).href" />
  • Webpack环境(Vue2/旧版Vue CLI)适用写法

<img :src="require(`../assets/${product.img}`)" />
  • 兼容性最优写法(所有环境通用)

提前把所有需要动态引用的图片导入,用映射表匹配使用:

// script中提前导入资源
import goods1 from '../assets/goods1.png'
import goods2 from '../assets/goods2.png'

const imgMap = {
  'goods1.png': goods1,
  'goods2.png': goods2
}
<!-- 模板中直接读取映射表 -->
<img :src="imgMap[product.img]" />

之前写法错误原因

  • :src="'@/public/' + product.img":@别名默认指向src目录,public和src平级,路径本身不存在,且动态拼接的别名不会被解析
  • :src="'/../../public/'+ product.img":public目录资源不会被编译到src对应的嵌套路径下,打包后无此相对路径
  • :src="'../assets/'+ product.img":动态拼接的路径不会被打包工具的资源加载器识别,未做编译转换,和打包后实际路径不匹配

内容的提问来源于stack exchange,提问作者Turqay Umudzade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 09:42:02