1、你是否遇到UI给你切双份icon图(正常显示颜色、高亮显示颜色)?我们前端小伙伴还得做交互引入两个图片,以后修改颜色又要换?好麻烦呀~~~
2、是否遇到有时候下载svg下来,想随意更改颜色遇到瓶颈?
本来懒人开发原则,还是弄好配置,后面想怎么改就怎么改!!
其他配置参考:vue3 + vue-cli3/4配置svg文件的全局使用
yarn add vite-plugin-svg-icons -D
还需要安装一个依赖的插件:yarn add fast-glob -D
vite-plugin-svg-icons用于生成 svg 雪碧图。
官网配置文档:https://github.com/vbenjs/vite-plugin-svg-icons/blob/main/README.zh_CN.md
特征:
做笔记时安装的依赖包版本为 :
"fast-glob": "^3.2.11",
"vite-plugin-svg-icons": "^2.0.1"
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
// 引入svg插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
const pathResolve = (pathStr) => {
return path.resolve(__dirname, pathStr)
}
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
createSvgIconsPlugin({
// 指定需要缓存的svg图标文件夹,即需要识别的svg都应该放在这个文件夹下
// iconDirs: [path.resolve(process.cwd(), 'src/assets/svgs')],
// 或
iconDirs: [pathResolve('./src/assets/svgs')],
// 指定symbolId格式(这里的配置与6.2步骤中的引入svg组件的name配置项写法有关)
symbolId: 'icon-[dir]-[name]',
}),
],
resolve: {
// 设置路径别名
alias: {
'@': pathResolve('./src'),
}
},
})
import 'virtual:svg-icons-register'
到这里 svg 雪碧图已经生成。
src/components/SvgIcon.vue
<template>
<svg aria-hidden="true" class="svg-icon">
<use :xlink:href="symbolId" :fill="color" />
</svg>
</template>
<script>
import { defineComponent, computed } from 'vue'
export default defineComponent({
name: 'SvgIcon',
props: {
// 使用的svg图标名称,也就是svg文件名
name: {
type: String,
required: true,
},
prefix: {
type: String,
default: 'icon',
},
color: {
type: String,
default: '#333',
}
},
setup(props) {
const symbolId = computed(() => `#${props.prefix}-${props.name}`)
return { symbolId }
},
})
</script>
<style scope>
.svg-icon {
width: 16px;
height: 16px;
color: #333;
fill: currentColor;
}
</style>
在main.js中引入SvgIcon.vue组件,全局注册后在需要使用SvgIcon组件的地方将无需再引入。
// 引入SvgIcon.vue组件
import SvgIcon from '@/components/SvgIcon.vue'
const app = createApp(App)
// 将SvgIcon.vue组件注册为全局组件
app.component('SvgIcon', SvgIcon)
这里以App.vue举例:
<script setup>
import HelloWorld from './components/HelloWorld.vue'
import logo from '@/assets/logo.png'
// 需要引入封装的公共SvgIcon.vue组件(因为6.1进行了全局注册该组件,所以这里无需再引入)
// import SvgIcon from '@/components/SvgIcon.vue';
</script>
<template>
<!-- 使用不是在svgs目录中嵌套文件夹下的svg图标的name写法:写上svg图标文件名即可 -->
<SvgIcon class="phone-icon" name="phone"></SvgIcon>
<SvgIcon class="delete-icon" name="deleteIcon"></SvgIcon>
<!-- 使用是在svgs目录中嵌套文件夹下的svg图标的name写法:中划线前面是文件夹名称,后面是svg图标文件名称 -->
<SvgIcon class="edit-icon" name="msg-iconEdit"></SvgIcon>
<!-- vue中使用图片的两种引入方式 -->
<!-- import导入方式 -->
<img alt="Vue logo" :src="logo" />
<!-- 直接使用路径别名方式 -->
<img alt="Vue logo" src="@/assets/logo.png" />
<HelloWorld msg="Hello Vue 3 + Vite" />
</template>
<style lang="less">
// 自定义svg颜色,宽高等样式
// 注意:这里之所以能自定义svg颜色,是因为我在.svg文件中把fill="xxx颜色值" 改为了fill="currentColor" (见下面第7步骤描述)
.phone-icon{
width: 24px;
height: 24px;
color: blue;
}
.delete-icon{
color: #666;
&:hover{
color: red;
}
}
</style>