Vue3-封装使用SVG

2023-01-03  本文已影响0人  江南永保春

前期准备工作

  1. 下载需要的SVG图标
  2. 初始化项目(笔者文档结构如下)


    image.png

相关文件

  1. index.js
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component 

// register globally
Vue.component('svg-icon', SvgIcon)

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

  1. svgo.yml
# replace default config

# multipass: true
# full: true

plugins:

  # - name
  #
  # or:
  # - name: false
  # - name: true
  #
  # or:
  # - name:
  #     param1: 1
  #     param2: 2

- removeAttrs:
    attrs:
      - 'fill'
      - 'fill-rule'
  1. SvgIcon


    image.png
<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners" height="15" width="15">
    <use :xlink:href="iconName" />
  </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'
      }
    },
    styleExternalIcon() {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
      }
    }
  }
}
</script>

<style scoped>
.svg-icon {
  /* width: 1em;
  height: 1em; */
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}

.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>
  1. package.json 同级的 vue.config.js文件 如果没有新建vue.config.js
const { defineConfig } = require("@vue/cli-service");
const path = require("path");

function resolve(dir) {
  return path.join(__dirname, dir);
}

module.exports = defineConfig({
  chainWebpack: (config) => {
    config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
    config.module
      .rule("icons")
      .test(/\.svg$/)
      .include.add(resolve("src/assets/icons/svg"))
      .end()
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]",
      })
      .end();
  },
});
  1. 使用:
  把svg图标放到 assets/icons/svg 文件夹里面 图标文件名 就是 所需要的类名
  <svg-icon icon-class="money" class-name="money-icon" />
   "class-name" 就是普通的 .类名称 { 样式 }
上一篇下一篇

猜你喜欢

热点阅读