VueJS根据for循环中的变量加载SVG文件,使用v-html给出[object Module]

Posted

技术标签:

【中文标题】VueJS根据for循环中的变量加载SVG文件,使用v-html给出[object Module]【英文标题】:VueJS loading SVG file depending on variable in for loop using v-html giving [object Module] instead 【发布时间】:2020-07-03 14:21:05 【问题描述】:

我正在尝试根据循环中的内容加载保存在单独文件中的 SVG。当页面加载时,我看到:

嘿,这是我的代码:

<div
  v-for="(rec, index) in stats"
  :key="index"
>
    <div class="iconForeground align-self-center" v-html="require(`../../../assets/svg/dashboard/attributes/$rec.icon.svg`)">
    </div>
</div>

这里是数据函数,为简洁起见,我省略了整个内容:

data() 
  return 
    stats: [name: "Leadership", percent: "75", top: "5", icon: "leadership", 
            name: "Innovation", percent: "25", icon: "genius-ideas"] as Array<Record<string, string>>
  

我怎样才能做到这一点?

编辑 这是我的 vue.config.js:

const path = require("path");

module.exports = 
  pluginOptions: 
    'style-resources-loader': 
      preProcessor: 'scss',
      patterns: [
        "./src/styles/global.scss"
      ]
    ,
    configureWebpack: 
      module: 
        rules: [
          test: /\.svg$/,
          loader: 'vue-svg-loader'
        ]
      
    
  

编辑 2 似乎即使在安装 url-loader 并按照建议之后,我仍然无法加载图像,这是我更新的 vue.config.js:

const path = require("path");

module.exports = 
  pluginOptions: 
    'style-resources-loader': 
      preProcessor: 'scss',
      patterns: [
        "./src/styles/global.scss"
      ]
    ,
    configureWebpack: 
      module: 
        rules: [
        
          test: /\.svg$/,
          loader: 'vue-svg-loader'
        ,
        
          test: /\.(png|jpg|gif)$/i,
          use: [
            
              loader: 'url-loader',
              options: 
                esModule: false,
              ,
            ,
          ],
        ]
      
    
  

还有我的html:

<div class="d-flex flex-column justify-content-center" :style="marginRight: '24px'">
    <div class="purpleDot"></div>
    <div class="iconForeground align-self-center">
       <img :src="require(`../../../assets/svg/dashboard/attributes/$rec.icon.svg`)" />
    </div>
</div>

【问题讨论】:

【参考方案1】:

答案是使用dynamic这样的组件

<template>
  div
    v-for="(m, i) in modules"
    :key="i">
    <component :is="m.image"></component>
  </div>
</template>

import PraiseIcon from "@/assets/svg/navigation-bar/Praise-Icon.svg";

components: 
  'Praise-Icon': PraiseIcon
,
data() 
  return 
    modules: [
        
          name: "Praise",
          image: "Praise-Icon",
        
      ] as Array<Record<string, string>>
  

【讨论】:

【参考方案2】:

删除你的 svg 加载器

   
          test: /\.svg$/,
          loader: 'vue-svg-loader'
        ,

将 svg 添加到您的 url-loader

  test: /\.(png|jpg|gif|svg)$/i,
          use: [
            
              loader: 'url-loader',
              options: 
                esModule: false,
              ,
            ,
          ],
        

这通常是因为你的 webpack 加载器设置

尝试将url-loader 中的esModule 选项设置为false

这应该可以解决您的问题。


您无需关注以下内容。

还有一个问题,即使你修复了你的加载器,你仍然无法加载它。

对于图像,您应该使用img 标签来加载它。

<img :src=`require(...)`/>

v-html 只会加载它的路径字符串。

【讨论】:

但我想将其加载为 svg,以便进一步自定义。我不想将其加载为图像。 以您的方式,您也不是将其加载为 svg,而是将其加载为字符串。无论如何,您可以设置 url-loader 选项来解决您的问题。不需要使用 img 标签。 我已经发布了我的 vue.config.js,你能指导我在哪里添加你所说的属性吗? @Ayudh 检查此文档webpack.js.org/loaders/url-loader 我明白了,xièxie :)

以上是关于VueJS根据for循环中的变量加载SVG文件,使用v-html给出[object Module]的主要内容,如果未能解决你的问题,请参考以下文章

如何使存储在 svg 图片的填充字段中的颜色成为变量?

如何在 VueJS 的 v-for 循环中定义起点

Vuejs 无法加载 svg 图像?

vue js 2 - 多个rest调用中的for循环fetchData

如何将 for 循环中的 .pkl 文件附加到 for 循环中创建的 pandas 数据帧?

VueJS中的For循环与对象数组中的TypeScript