如何在 Nuxt 应用程序中包含内联 .svg

Posted

技术标签:

【中文标题】如何在 Nuxt 应用程序中包含内联 .svg【英文标题】:How to include inline .svg in Nuxt application 【发布时间】:2020-05-19 11:38:38 【问题描述】:

我想做一件普通的事情——在 Vue Nuxt 应用程序中动态包含一个 svg html,我可以设置它的样式。为此,我创建了一个组件,但不是图像,而是文本 data:image/svg+xhtml...

如何让它发挥作用?

<template>
   <div v-html="src"></div>
</template>
<script>
export default 
    name: 'Icon',
    props: 
        name: 
            type: String,
            required: true
        
    ,
    computed: 
        src() 
            const src = require(`assets/icons/$this.name.svg`)
            return src
        
    

</script>

【问题讨论】:

【参考方案1】:

这并不容易,我尝试了一堆“看起来”应该可行的不同解决方案。

我的理解是,它归结为 Webpack 如何处理“图像”资产以及使用它们内联和独立使用它们会改变定义。

我有一个需要代码访问的 SVG 图标库(例如在运行时更改颜色),所以我必须将 SVG 内联。这就是我登陆的地方,它并不理想,但它有效。


使用 SVG 名称的 prop 插槽创建一个新组件。在该组件内添加所有 svg 作为代码。将每一个都包装在一个 v-if 中。

<template>
   <div class="svgIcon">
      <svg v-if="icon == 'name1'">...</svg>
      <svg v-if="icon == 'name2'">...</svg>
      <svg v-if="icon == 'name3'">...</svg>
      <svg v-if="icon == 'name4'">...</svg>
   </div>
</template>
<script>
  export default 
    props: ['icon']
  
</script>

然后通过在插槽中填写你想要的名称来使用组件

<template>
   <div>
      <svgIcons :icon="name1"></svgIcons>
   </div>
</template>
<script>
  import svgIcons from '../path/to/iconsComponent.vue'
  export default 
    components:  svgIcons ,
    ...
  
</script>

【讨论】:

【参考方案2】:

看起来@nuxtjs/svg 会做你想做的事。安装后尝试:

<template>
   <div v-html="src"></div>
</template>
<script>
export default 
    name: 'Icon',
    props: 
        name: 
            type: String,
            required: true
        
    ,
    computed: 
        src() 
            const src = require(`assets/icons/$this.name.svg?raw`)
            return src
        
    

</script>

【讨论】:

不错。我试图在一个直接的 Vue 项目中做到这一点。 Nuxt 插件是一个更好的解决方案。 @laptou 我现在有文本 /_nuxt/5476b1293b10e0056bf8a8f9cf8c93c4.svg 而不是图像 我遇到了同样的问题,并用&lt;component v-bind:is="src"&gt;&lt;/component&gt; 替换了&lt;div v-html="src"&gt;&lt;/div&gt;。 src 计算属性也可以返回这个return require(`assets/icons/$this.name.svg?inline`).default 赞成如果你所有的 svg 文件都在 node_modules 文件夹中 @PirateApp 为什么要将 SVG 文件放在 node_modules 文件夹中?

以上是关于如何在 Nuxt 应用程序中包含内联 .svg的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 Blade 模板中包含 SVG 内容

如何在 nuxt-i18n 文本中包含链接

Nuxt 不会在 Firefox 中将内联 SVG 作为 Vue 组件加载,我该怎么办?

如何在Nuxt.js项目的页面中包含CSS

如何在 Haml 中包含内联 JavaScript?

Django:如何在 list_display 中包含内联模型字段?