svg图标封装组件
本文最后更新于:2021年6月8日 下午
VUE项目中将svg图标封装为组件,后续拷贝进svg文件直接使用
icon组件
<template>
<svg :class="svgClass" aria-hidden="true"
// /* aria-hidden="true"将元素从可访问树上移除 */
v-on="$listeners">
<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'
}
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
配置自动引入svg文件
使用webpack
的require.context
API,两种方法
assets/icon
是存放svg
图标文件的路径
- 在
assets/icon
新建index.js
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'
Vue.component('svg-icon', SvgIcon)
const importAll = r => r.keys().forEach(r)
const svgContext = require.context('@/assets/icon', false, /\.svg$/);// 获取该目录下所有.svg的context
importAll(svgContext)
//在main.js中导入
import '@/assets/icon/index'
- 或者直接在
main.js
中
import SvgIcon from '@/components/SvgIcon'
const importAll = r => r.keys().forEach(r)
const svgContext = require.context('@/assets/icon', false, /\.svg$/);// 获取该目录下所有.svg的context
importAll(svgContext)
Vue.component('svg-icon',SvgIcon) // 全局注册
devDependencies
svg-baker-runtime
svg-sprite-loader
- 配置
// vue.config.js chainWebpack: (config) => { const svgRule = config.module.rule("svg"); svgRule.uses.clear(); svgRule .rule("icons") .test(/\.svg$/) .include.add(resolve("src/assets/icon")) .end() .use("svg-sprite-loader") .loader("svg-sprite-loader") .options({ symbolId: "[name]", }); },
使用
尺寸可以自己覆盖样式
<svg-icon
:icon-class="cardData.platform"
style="width: 2em; height: 2em;vertical-align:middle"
></svg-icon>
svg图标封装组件
http://yoursite.com/2022/02/24/svg图标封装组件/