Vue 为图片赋值动态地址

Vue 图片的 src 属性在赋值时,如果是静态内容可以直接指定,但动态内容则不行

静态指定的方式

  1. 一般静态指定时,会将图片放在相同路径下,然后通过绝对路径进行指定
1
2
3
<mt-header fixed>
  <img class="logo" src="./images/logo.png" alt="logo" slot="left">
</mt-header>

静态方式碰到动态地址存在的问题

  1. 根据 Vue 动态赋值的原则,如果要动态指定地址,则需要通过以下方式
1
2
3
<mt-header fixed>
  <img class="logo" :src="`./images/logo-${type}.png`" alt="logo" slot="left">
</mt-header>
  1. 但实际上通过上述方式无法加载到对应图片,因为在 webpack 中静态图片会被当做模块来加载,如果改为动态加载,url-loader 则无法解析图片地址
  2. 也就是说如果动态去加载静态图片,会导致程序在启动前无法获取到完整的图片路径,从而无法加载到对应的静态资源

动态指定的方式

  1. 有些情况下,需要被加载的图片资源是固定的,但图片的名称却需要动态匹配
  2. 对于这些静态资源,如果放置到图片服务器感觉有点大材小用,所以其实可以放置在项目的 /static 目录下

  1. 对于在该目录下的图片资源,项目启动时会预加载,所以就算动态指定具体名称,也可以获取到对应图片
  2. 之后在指定时只需要通过绝对路径写明图片地址即可
1
2
3
<div class="employment-item">
  <img :src="`/mop/static/character/consultant-${active(2) ? 'white' : 'blue'}.png`">
</div>

动态指定需要注意的点

  1. 一般生产环境中对于项目静态资源都会指定一个根路径
  2. 具体指定方式在 config/index.js 文件中的 build 节点,存在如下代码

  1. assetsPublicPath 就是为静态资源指定的根路径
  2. 为了和生产环境保持一致,开发环境也需要在 config/index.js 中的 dev 节点指定