vue-svg-icon

svg组件封装
  1. 在src/components 文件夹下新建SvgIcon文件夹, 文件夹下新建index.vue文件, 内容如下
<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName"></use>
  </svg>
</template>

<script>
export default {
  name: "SvgIcon",
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ""
    }
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`;
    },
    svgClass() {
      if (this.className) {
        return "svg-icon" + this.className;
      } else {
        return "svg-icon";
      }
    }
  }
};
</script>

<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>
  1. 在src目录下新建 icons 目录, 目录结构如下
    a. svg文件夹 主要存放svg格式文件
    b. index.js 将svgicon 组件注册到全局, 内容如下
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'

Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg', false, /\.svg$/)
// 这行代码就会去当前目录下 svg 文件夹(不包含子目录)下面的找所有文件名以 .svg 结尾的文件能被 require 的文件。
// 更直白的说就是 我们可以通过正则匹配引入相应的文件模块
/** require.context有三个参数:
* directory:说明需要检索的目录
* useSubdirectories:是否检索子目录
* regExp: 匹配文件的正则表达式
*/
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
  1. 在main.js引用
// 引入svg
import './icons'
  1. 配置 svg-sprite-loader
// vue.config.js 文件
// set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  1. 使用
      <svg-icon class="svg-icon" icon-class="404"></svg-icon>
      <svg-icon class="svg-icon" icon-class="bug"></svg-icon>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容