Vue3 element 本地svg图标封装组件

14 min read

封装组件

components文件下新建SvgIcon组件 ,内容如下:

1<template>
2  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
3    <use :xlink:href="iconName" />
4  </svg>
5</template>
6
7<script>
8export default {
9  name: 'SvgIcon',
10  props: {
11    iconClass: {
12      type: String,
13      required: true
14    },
15    className: {
16      type: String,
17      default: ''
18    }
19  },
20  computed: {
21    iconName() {
22      return `#icon-${this.iconClass}`
23    },
24    svgClass() {
25      if (this.className) {
26        return 'svg-icon ' + this.className
27      } else {
28        return 'svg-icon'
29      }
30    }
31  }
32}
33</script>
34
35<style scoped>
36.svg-icon {
37  width: 1em;
38  height: 1em;
39  vertical-align: -0.15em;
40  fill: currentColor;
41  overflow: hidden;
42}
43</style>
44
45

将所需svg文件放置icons的svg文件夹下, icons文件下的index.js文件中的代码如下:

1import Vue from 'vue'
2import SvgIcon from '@/components/SvgIcon'// svg组件
3
4// register globally
5Vue.component('svg-icon', SvgIcon)
6
7const req = require.context('./svg', false, /\.svg$/)
8const requireAll = requireContext => requireContext.keys().map(requireContext)
9requireAll(req)
10
11

main.js中引入icons文件,直接在组件中使用icon-class为svg名字的图标即可

插件安装

安装svg-sprite-loader,yarn add svg-sprite-loader -D

在vue.config.js文件下配置svg-sprite-loader

1const path = require('path')
2function resolve (dir){
3    return path.join(__dirname,dir)
4} 
5
6module.exports = {
7  configureWebpack: {
8    resolve: {
9      //路径别名配置
10      alias: {
11        '@': resolve('src'),
12        'assets': resolve('@/assets'),
13        'common': resolve('@/common'),
14        'components': resolve('@/components'),
15        'network': resolve('@/network'),
16        'views': resolve('@/views'),
17      }
18    }
19  },
20  
21  chainWebpack: (config) => {
22    //配置 svg-sprite-loader
23    // 第一步:让其他svg loader不要对src/icons进行操作
24    config.module
25      .rule('svg')
26      .exclude.add(resolve('src/icons/svg'))//注意:路径要具体到存放的svg的路径下,不然会报错
27      .end()
28    // 第二步:使用svg-sprite-loader 对 src/icons下的svg进行操作
29    config.module
30      .rule('icons')
31      .test(/\.svg$/)
32      .include.add(resolve('src/icons/svg'))//注意:路径要具体到存放的svg的路径下,不然会报错
33      .end()
34      .use('svg-sprite-loader')
35      .loader('svg-sprite-loader')
36      //定义规则 使用时 <svg class="icon"> <use xlink:href="#icon-svg文件名"></use>  </svg>
37      .options({
38        symbolId: 'icon-[name]'
39      })
40      .end()
41  }
42