版本

Vite:4.0.0
Vue:3.2.45
vite-plugin-svg-icons:2.0.1

直接加载Svg图标

在目前的版本中已支持在组件中直接渲染svg图标,如下:

<template>
    <svg xmlns="http://www.w3.org/2000/svg" width="19" height="19" viewBox="0 0 23.03 23">
        <defs></defs>
        <path
            data-name="多边形 1"
            d="M1592.26,2439h-11.51l-5.76-10,5.76-10h11.51l5.76,10Zm-1.02-18h-9.5l-4.74,8,4.74,8h9.5l4.75-8Zm1.51,8.53a1,1,0,0,1-1.37-.37l-2.5-4.33a1,1,0,0,1,1.74-1l2.5,4.33A1.01,1.01,0,0,1,1592.75,2429.53Zm-6.25.47a1.5,1.5,0,1,1,1.5-1.5A1.5,1.5,0,0,1,1586.5,2430Zm-4.12,4.16-2.5-4.33a1,1,0,0,1,1.74-1l2.5,4.33A1,1,0,0,1,1582.38,2434.16Z"
            transform="translate(-1575 -2417.5)"
            fill="#fff" />
    </svg>
</template>

此时Vite项目中的渲染结果如下:
在这里插入图片描述
但一个一个将svg内容放入组件并不现实,这会浪费大量的人力以及增加大量的svg图标子组件,因此需要一个可以动态加载Svg图标的东西,而 vite-plugin-svg-icons 组件可以帮你做到这一步

插件使用方式

安装插件

yarn add vite-plugin-svg-icons -D
# or
npm i vite-plugin-svg-icons -D
# or
pnpm install vite-plugin-svg-icons -D

修改 vite.config.ts 配置文件

import { fileURLToPath, URL } from 'node:url';
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import path from 'path';

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [
        vue(),
        // 添加以下6行,并根据自己需求进行配置
        createSvgIconsPlugin({
            // 指定需要缓存的图标文件夹
            iconDirs: [path.resolve(process.cwd(), 'src/plugins/svg-icon/svgs')],
            // 指定symbolId格式
            symbolId: '[name]',
        }),
    ],
    resolve: {
        alias: {
            '@': fileURLToPath(new URL('./src', import.meta.url)),
        },
    },
});

修改 tsconfig.json 文件

如果你项目中没有使用TS,那么无需修改

"types": [
	...
    "vite-plugin-svg-icons/client"
]

src/plugins/svg-icon/ 目录下新建 SvgIcon.vue ,并添加如下内容

使用了setup语法糖写法

<template>
    <svg aria-hidden="true" :width="width" :height="height">
        <use :xlink:href="symbolId" :fill="fill" />
    </svg>
</template>

<!-- SvgIcon组件,可将svg图标直接当组件使用 -->
<script setup lang="ts">
import { computed } from 'vue';

/**
 * 输入属性             类型                默认值              是否必选                描述
 *  name              string             undefined              是                  svg图标名字
 *  width             number                19                  否                  svg图标宽度
 *  height            number                19                  否                  svg图标高度
 *  fill              string              #ffffff               否                  svg图标填充颜色
 */
const props = withDefaults(
    defineProps<{
        name: string;
        width?: number;
        height?: number;
        fill?: string;
    }>(),
    {
        width: 19,
        height: 19,
        fill: '#ffffff',
    }
);

// 获取svg图标名称,需要和vite.config.ts中的配置保持一致
const symbolId = computed(() => `#${props.name}`);
</script>

<style scoped lang="scss"></style>

src/plugins/svg-icon/ 目录下新建 svgs 文件夹,并将需要用到的svg图标放入其中
在这里插入图片描述

src/plugins/svg-icon/ 目录下新建 index.ts ,并添加如下内容

import { type App } from 'vue';
import SvgIcon from './SvgIcon.vue';
import 'virtual:svg-icons-register';
/**
 * Svg图标插件
 */
export default {
    install: (app: App): void => {
        app.component('svg-icon', SvgIcon);
    },
};

全局注册 SvgIcon 组件,在 main.ts 中新增

import svgIcon from './plugins/svg-icon';
....
const app = createApp(App);
app.use(svgIcon);

然后就可以在任意一个组件中直接使用该组件了

<template>
    <svg-icon name="model"></svg-icon>
</template>

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐