前言
大家好,我是前端小喵
代码地址
实现思路
1、安装依赖
npm i vite-plugin-svg-icons -D 或者
yarn add vite-plugin-svg-icons -D
2、main.js 引入
import 'virtual:svg-icons-register'
3、配置svg图片文件夹
4、vite.config.js配置plugins
import { defineConfig } from "vite"
import vue from "@vitejs/plugin-vue"
import path from "path"
import { createSvgIconsPlugin } from "vite-plugin-svg-icons"
function resolve(dir) {
return path.join(__dirname, dir)
}
export default defineConfig({
plugins: [
vue(),
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [resolve("./src/assets/svg")],
// 指定symbolId格式
symbolId: "[name]",
}),
],
})
5、svg-icon组件
<template>
<svg aria-hidden="true" class="svg-icon" :fill="props.color" :width="width" :height="height">
<use :xlink:href="symbolId" :fill="props.color" />
</svg>
</template>
<script setup>
import { computed } from 'vue'
const props = defineProps({
name: {
type: String,
required: true
},
size: {
type: String,
default: '1em'
},
width: {
type: String
},
height: {
type: String
},
color: {
type: String,
default: 'currentColor'
}
})
const symbolId = computed(() => `#${props.name}`)
const width = computed(() => (props.width ? props.width : props.size))
const height = computed(() => (props.height ? props.height : props.size))
</script>
<style lang="scss" scoped>
.svg-icon {
fill: currentColor;
outline: none;
&.default-font-size {
font-size: 14px;
}
}
</style>
6、main.js 全局注册组件
// 全局组件可以src/components/global全局动态解析注册,这里只是直接引入注册
import svgIcon from "./components/svg-icon.vue"
createApp(App).component("svg-icon", svgIcon).mount("#app")
7、使用svg-icon组件
<svg-icon name="vue"></svg-icon>
补充:
1、svg预览插件 svg-preview
2、改变svg颜色
svg里面的fill全部去掉
往svg-icon传入color到svg的fill
<svg-icon name="vue" color="#41B883"></svg-icon>