Vue.js 模板中的静态图片 src

IT技术 javascript webpack vue.js
2021-02-16 16:44:30

我的 Vue 组件包含一些图像。我想稍后进行延迟加载,因此我需要先将图像的src设置为小图像。

<template>
        <div v-for="item in portfolioItems">
            <a href="#{{ item.id }}">
                <img
                    data-original="{{ item.img }}"
                    v-bind:src="/static/img/clear.gif"
                    class="lazy" alt="">
            </a>
        </div>
</template>

给了我一堆错误,例如:

[Vue 警告]:表达式无效。生成的函数体:/scope.static/scope.img/scope.clear.gif vue.common.js:1014[Vue

[Vue 警告]:评估表达式“/static/img/clear.gif”时出错:TypeError:无法读取未定义的属性“调用”(在组件中找到:)

webpack.config.js:
module.exports = {
    // ...
    build: {
        assetsPublicPath: '/',
        assetsSubDirectory: 'static'
    }
}
6个回答

此解决方案适用于 Vue-2 用户:

  1. vue-2如果你不喜欢在你的文件static夹(相关信息),或
  2. vue-2&vue-cli-3如果您不想将文件保存在文件public夹中(static文件夹重命名为public):

简单的解决方案是:)

<img src="@/assets/img/clear.gif" /> // just do this:
<img :src="require(`@/assets/img/clear.gif`)" // or do this:
<img :src="require(`@/assets/img/${imgURL}`)" // if pulling from: data() {return {imgURL: 'clear.gif'}}

如果您想将静态图像保存在static/assets/imgpublic/assets/img文件夹中,那么只需执行以下操作:

<img src="./assets/img/clear.gif" />
<img src="/assets/img/clear.gif" /> // in some case without dot ./
@VinceBanzon 很高兴对你有所帮助,别忘了投票;)
2021-04-19 16:44:30
<img :src="require( @/assets/img/clear.gif)"> 为我工作。我的文件结构在 /assets/img/clear.gif 中。感谢您提供多种选择。最后,一个对我有用。
2021-04-21 16:44:30
使用 vue-cli-3,这个答案终于帮我动态加载了路径字符串。
2021-05-06 16:44:30
我把 '@' 放在变量里面。您的解决方案是将 '@' 放在标签中,而变量则是只放入文件名,而不是路径。太棒了!谢谢!
2021-05-14 16:44:30
这仍然适用于 VueCLI 4.4。谢谢好心的先生,你刚刚被点赞了!!;)
2021-05-16 16:44:30

如果要将字符串绑定到src属性,则应将其用单引号括起来:

<img v-bind:src="'/static/img/clear.gif'">
<!-- or shorthand -->
<img :src="'/static/img/clear.gif'">

IMO 您不需要绑定字符串,您可以使用简单的方法:

<img src="/static/img/clear.gif">

在此处查看有关图像预加载的示例:http : //codepen.io/pespantelis/pen/RWVZxL

这就是我解决它的方法。:

      items: [
        { title: 'Dashboard', icon: require('@/assets/icons/sidebar/dashboard.svg') },
        { title: 'Projects',  icon: require('@/assets/icons/sidebar/projects.svg') },
        { title: 'Clients', icon: require('@/assets/icons/sidebar/clients.svg') },
      ],

在模板部分:

<img :src="item.icon" />

在这里查看它的实际效果

惊人。搜索1小时后。您能否还建议我们为什么在这种特定情况下需要@require
2021-04-28 16:44:30
它正在工作。我在我的回答中添加了一个沙箱示例。看看它。
2021-05-11 16:44:30

@Pantelis 的回答以某种方式引导我找到解决类似误解的方法。我正在处理的留言板项目需要显示可选图像。我试图让 src=imagefile 连接固定路径和可变文件名字符串,直到我看到 "''" 引号的古怪用法:-)

<template id="symp-tmpl">
  <div>
    <div v-for="item in items" style="clear: both;">
      <div v-if="(item.imagefile !== '[none]')">
        <img v-bind:src="'/storage/userimages/' + item.imagefile">
      </div>
      sub: <span>@{{ item.subject }}</span>
      <span v-if="(login == item.author)">[edit]</span>
      <br>@{{ item.author }}
      <br>msg: <span>@{{ item.message }}</span>
    </div>
  </div>
</template>

声明该值包含图像路径的新变量

const imgLink = require('../../assets/your-image.png')

然后调用变量

export default {
    name: 'onepage',
    data(){
        return{
            img: imgLink,
        }
    }
}

将其绑定在 html 上,示例如下:

<a href="#"><img v-bind:src="img" alt="" class="logo"></a>

希望它会有所帮助