如何在 Vue 单文件组件中导入和使用图片?

Posted

技术标签:

【中文标题】如何在 Vue 单文件组件中导入和使用图片?【英文标题】:How to import and use image in a Vue single file component? 【发布时间】:2017-12-20 08:54:27 【问题描述】:

我认为这应该很简单,但是我在如何在 Vue 单文件组件中导入和使用图像时遇到了一些麻烦。有人可以帮我怎么做吗?这是我的代码 sn-p:

<template lang="html">
    <img src="zapierLogo" />
</template>
    
<script>
    import zapierLogo from 'images/zapier_logo.svg'
    
    export default 
    
</script>
    
<style lang="css">
</style>

我尝试过使用:srcsrc=" zapierLogo " 等。但似乎没有任何效果。我也找不到任何例子。有什么帮助吗?

【问题讨论】:

如果是静态svg图片就用src='images/zapier_logo.svg' 您的控制台是否出现错误? 【参考方案1】:

就这么简单:

<template>
    <div id="app">
        <img src="./assets/logo.png">
    </div>
</template>
    
<script>
    export default 
    
</script>
    
<style lang="css">
</style> 

取自vue cli生成的项目。

如果您想将图像用作模块,请不要忘记将数据绑定到您的 Vuejs 组件:

<template>
    <div id="app">
        <img :src="image"/>
    </div>
</template>
    
<script>
    import image from "./assets/logo.png"
    
    export default 
        data: function () 
            return 
                image: image
            
        
    
</script>
    
<style lang="css">
</style>

还有一个更短的版本:

<template>
    <div id="app">
        <img :src="require('./assets/logo.png')"/>
    </div>
</template>
    
<script>
    export default 
    
</script>
    
<style lang="css">
</style> 

【讨论】:

如果您希望将其包含在数据中,您可能还想包含 image: require('path/to/file') 我认为我们还应该提到在 url 之前使用波浪号(~)。如果您不使用require。 src="~src/assets/img/me.png" :src="require('@/assets/image.png')" 为我工作。 如何在 background-image:url('') 中使用? 图像作为模块的方式是我唯一可行的方式。【参考方案2】:

强烈建议在从资产导入图片时使用 webpack,一般用于优化和路径目的

如果你想通过 webpack 加载它们,你可以简单地使用 :src='require('path/to/file')' 确保你使用 : 否则它不会像 javascript 一样执行 require 语句。

在 typescript 中,您可以执行几乎完全相同的操作::src="require('@/assets/image.png')"

为什么以下通常被认为是不好的做法:

<template>
  <div id="app">
    <img src="./assets/logo.png">
  </div>
</template>

<script>
export default 

</script>

<style lang="scss">
</style> 

使用 Vue cli 构建时,webpack 无法确保资产文件将保持遵循相对导入的结构。这是由于 webpack 试图优化和分块出现在 assets 文件夹中的项目。如果您希望使用相对导入,您应该在 static 文件夹中执行此操作并使用:&lt;img src="./static/logo.png"&gt;

【讨论】:

那么&lt;img :src="require('@/assets/image.png')"&gt;?这对我不起作用。它抱怨找不到依赖项。 @Pithikos 出现此错误的原因有很多,您能否扩展更多内容或发布问题,我可以尝试调试。 url-loader 允许您有条件地将文件内联为 base-64 数据 URL(如果它们小于给定阈值)。这可以减少对琐碎文件的 HTTP 请求量。如果文件大于阈值,它会自动回退到文件加载器。 - 如果你不使用 webpack 来加载你的图像,你将不会获得这个好处或这里提到的其他好处:vue-loader.vuejs.org/guide/asset-url.html#transform-rules@akauppi @akauppi 我非常怀疑你使用的是 vue.js 而不是 webpack,vue 的原生开发服务器是 webpack,构建器也是 webpack,你还问它是否仍然相关,根据文档仍然非常相关,因此可以回答您的评论。下次不想回答就别问了。【参考方案3】:

我最近遇到了这个问题,我正在使用 Typescript。 如果您像我一样使用 Typescript,那么您需要像这样导入资产:

<img src="@/assets/images/logo.png" >

【讨论】:

虽然这确实有效,但在这种情况下你并没有利用 webpack。 我没有使用 Typescript,但我必须使用您的解决方案。谢谢。【参考方案4】:

这些在 JavaScript 和 TypeScript 中都适用于我

<img src="@/assets/images/logo.png" > 

 <img src="./assets/images/logo.png" >

【讨论】:

虽然这确实有效,但在这种情况下你并没有利用 webpack。此外,在实践中不鼓励使用 src="./assets/images/logo.png",因为与静态不同,您无法确保在构建时如何捆绑资产目录中的项目。【参考方案5】:

你也可以像这样使用root快捷方式

  <template>
   <div class="container">
    <h1>Recipes</h1>
      <img src="@/assets/burger.jpg" />
   </div>
  </template>

虽然这是 Nuxt,但它应该与 Vue CLI 相同。

【讨论】:

【参考方案6】:

我在quasar 中遇到问题,这是一个基于vue 的移动框架,标题语法~assets/cover.jpg 在普通组件中有效,但在我的动态定义组件中无效,由

let c=Vue.component('compName',...)

终于完成了这项工作:

    computed: 
      coverUri() 
        return require('../assets/cover.jpg');
      
    
<q-img class="coverImg" :src="coverUri" : spinner-color="white"/>

根据https://quasar.dev/quasar-cli/handling-assets的解释

In *.vue components, all your templates and CSS are parsed by vue-html-loader and css-loader to look for asset URLs. For example, in &lt;img src="./logo.png"&gt; and background: url(./logo.png), "./logo.png" is a relative asset path and will be resolved by Webpack as a module dependency.

【讨论】:

【参考方案7】:

对于 Vue 3,我必须使用

<template>
  <div id="app">
    <img :src="zapierLogo" />
  </div>
</template>

<script>
import zapierLogo from 'images/zapier_logo.svg'


export default 
    ...
    data: function () 
        return 
            zapierLogo
        
    

</script>

src="@/assets/burger.jpg"src="../assets/burger.jpg" 似乎都不起作用。

【讨论】:

【参考方案8】:

..当一切都失败时,就像在我的情况下,我试图导入一个占位符,我在多页 Vuelectro-app 中使用了几次 - 但这次在一个子子组件中,没有一个建议的解决方案起作用(因为他们通常会)..

<template>
    <div id="app">
        <img :src="image"/>
    </div>
</template>

<script>        
    export default 
        data()  return image: null, ... ,
        methods: 
          solveImage()
            const path = require('path')
            return path.join(process.cwd(), '/src/assets/img/me.jpg')
          ,
          ...
         ,
         mounted: 
           this.image = this.solveImage()
           ...
         
    
</script>

..应该这样做。

如果它在 created-lifecycle-hook 中效果更好,或者您希望全局要求路径并调用

this.image = path.join(...)

在其中一个钩子中 - 你应该测试自己。

【讨论】:

【参考方案9】:

我也面临同样的问题来显示资产图像。最后,这两种方式对我来说都很好-

<img src="@/assets/img/bg1.png" />

<img :src="require('@/assets/img/bg1.png')" />

【讨论】:

以上是关于如何在 Vue 单文件组件中导入和使用图片?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TypeScript 时如何在单个文件组件中导入 Vue?

在模板内的 vuejs 组件中导入和使用类

如何使用 Blazor 框架在前端浏览器中导入和导出 Excel

VueJS 和 SASS - 在脚本中导入和使用 SASS 变量

如何在 django 项目中导入和显示 csv 文件

如何在flutter中导入和使用另一个dart文件中的函数