svg-icon 使用教程

307 阅读1分钟

4e2375cf3bc79f3d25fec5dcffa1cd11738b29d9.jpeg

svg 可以说是前端程序员必备的一部分了,虽然实际使用相较其他框架确实有些麻烦,但架不住使用的人多,尤其是一些老的代码,在进行迭代的时候不会配置可以说是艸了(加班到只剩我一个人的那种,说实话,大晚上一个人在工位上有点不讲究啊),废话少说,进入正题。

开始

1.下载

总而言之4个包

## 使用npm
npm install vue-svg-icon xml-loader -D
## 使用yarn 
yarn add vue-svg-icon xml-loader 

## 以下的东西以防万一加上吧
npm install svg-sprite-loader
npm install svgo

2.配置(这里是重点)

2.1. 配置新增第一部分

截屏2022-09-16 02.09.50.png /src/icons ## icon的总文件夹 ,

/icons/svg ## 放svg文件的地方,这个东西你就从www.iconfont.cn 或者找ui要,再或者从老代码里扒下来就行 基本上就是这个样子 截屏2022-09-16 02.26.04.png

/icons/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)

全部复制就对啦,其他人也一样,别找啦

/icons/svgo.yml ## 应该是搭配svgo使用的,暂时没怎么关注过

# 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'

2.2.配置新增第二部分

截屏2022-09-16 02.17.31.png

新建

/src/components/svgIcon/index.vue

<template>

<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />

<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">

<use :xlink:href="iconName" />

</svg>

</template>

<script>

// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage

import { isExternal } from '@/utils/validate'

export default {

name: 'SvgIcon',

props: {

iconClass: {

type: String,

required: true

},

className: {

type: String,

default: ''

}

},

computed: {

isExternal() {

return isExternal(this.iconClass)

},

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>

直接复制,其他人的也一样,别对比啦

2.3.配置第三部分

截屏2022-09-16 02.20.34.png

新增 /src/utils/validate.js

export function isExternal(path) {

return /^(https?:|mailto:|tel:)/.test(path)

}

2.4. 配置第四部分

截屏2022-09-16 02.41.43.png

vue.config.js 中 添加如图

引入path可能会提示错误,是eslint的问题,这个记得不太清啦,出提示了直接百度,第一个就是答案

const path = require('path')

function resolve (dir) {

return path.join(__dirname, dir)

}
chainWebpack (config) {

// 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()

2.4. 配置第五部分

截屏2022-09-16 02.32.58.png

在main.js 中全局引入

import '@/icons/index.js'

3. 使用

直接使用,不用再引入什么东西

截屏2022-09-16 02.36.30.png

<svg-icon

style="width: 83px; height: 83px"

icon-class="disk"

></svg-icon>

## 也可以

<svg-icon

style="width: 83px; height: 83px"

:icon-class="'disk'"

></svg-icon>

着重关注一下2.3. 如果不写那个会报错

好啦,今天的教程就到这里啦

05115a44e88b0d141d4b0510197384cd.jpeg