Vue2封装SvgIcon

122 阅读1分钟

首先,需要保证项目安装了svg-sprite-loader库,并且在vue.config.js中做了对应的设置。

核心代码是下面两个文件,都存放在SvgIcon文件夹内。index.js为导出代码,在main.js中导入该文件,即可使用。

// main.js
import "@/component/SvgIcon"

使用方法特别简单,直接<svg-icon icon-class="svg文件名">即可。

index.js文件代码

// index.js

/**
 * 自定义svg-icon
 * 使用说明:
 *  1、下载或制作svg文件,存放到/src/assets/icons/svg目录下
 *  2、运行 npm run svgo 可压缩精简svg
 *  3、Vue文件中使用Demo:<svg-icon icon-class="svg文件名">
 */
import Vue from "vue"
import SvgIcon from "./SvgIcon.vue"

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

const req = require.context('../../assets/icons/svg', false, /\.svg$/);
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

SvgIcon.vue文件代码

<template>
  <svg :class="svgClass" aria-hidden="true">
    <use :xlink:href="iconName"></use>
  </svg>
</template>

<script>
export default {
  name: "SvgIcon",
  props: {
    iconClass: {
      type: String,
      required: true,
    },
    className: {
      type: String,
      required: "",
    },
  },
  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>