【问题标题】:How to import multiple svgs in vue.js via vue-svg-loader如何通过 vue-svg-loader 在 vue.js 中导入多个 svg
【发布时间】:2020-03-27 15:23:55
【问题描述】:

我想在一个 vue 组件中导入多个 svg。文档说我必须导入它们中的每一个,但是如何以更短、更简洁的方式导入多个 svg?

vue-svg-loader 文档:https://vue-svg-loader.js.org/

<script>
import Info from "@/assets/svgs/info.svg";
import Help from "@/assets/svgs/help.svg";
import Close from "@/assets/svgs/close.svg";
// etc. pp.

export default {
  components: {
    Info,
    Help,
    Close
  }
</script>

如果我要导入超过一百个 svg 会怎样?

有解决这个问题的想法吗?

【问题讨论】:

  • 你能把它们嵌入到一个巨大的 XML 文件中吗?

标签: javascript vue.js svg import vue-component


【解决方案1】:

创建一个base component 并在全球范围内注册它,因为您会非常频繁地使用它。


创建一个使用require with expression 为SVG 模块创建上下文的&lt;BaseIcon&gt; 组件:

<template>
  <Component
     :is="require(`@/assets/svgs/${name}.svg`).default"
     class="BaseIcon"
     v-bind="$attrs"
     @v-on="$listeners"
  />
</template>

<script>
export default {
  name: 'BaseIcon',

  // Transparent wrapper component
  // https://vuejs.org/v2/guide/components-props.html#Disabling-Attribute-Inheritance
  inheritAttrs: false,

  props: {
    name: {
      type: String,
      required: true,
    },
  },
}
</script>

<style>
 .BaseIcon {
   /* Add some default CSS declaration blocks */
 }
 </style>

注意:我们使用&lt;Component&gt; 处理dynamic components,假设您将使用vue-svg-loader 并且SVG 被视为组件。如果不是这种情况,请改用&lt;img&gt; 标签并改用src 而不是is


全局注册基础组件:

如果您只创建一个基础组件,您只需转到您的main.js 文件,然后在安装应用程序之前执行以下操作:

import Vue from 'vue'
import BaseIcon from './components/_base/BaseIcon.vue'
import App from './App.vue'

Vue.component('BaseIcon', BaseIcon)

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

否则,如果您想要更复杂一点的东西,请查看this boilerplate registers base components automatically 的方法。


最后,像这样使用组件:

<template>
  <div>
    <BaseIcon
      name="info"
    />
    <BaseIcon
      name="help"
    />
    <BaseIcon
      name="close"
    />
  </div>
</template>

<script>
export default {
  name: 'SomeComp',
}
</script>

【讨论】:

  • 嗨@Ricky,非常感谢 - 看起来非常准确。我创建了 BaseIcon 组件,在 main.js 中全局添加它并通过 实现。但我收到一个错误:无法安装组件:未定义模板或渲染功能。有什么想法吗?
  • 修复它::is="require(@/assets/svgs/${name}.svg).default"
  • @wittgenstein Chris 解释了为什么需要使用default,具体取决于模块的导入方式here
猜你喜欢
  • 2023-01-20
  • 2020-08-09
  • 2021-03-13
  • 2020-09-09
  • 2020-05-29
  • 2020-01-03
  • 2017-12-17
  • 2020-02-25
  • 2018-09-28
相关资源
最近更新 更多