在 Vue 3 项目中,可以将 SVG 文件作为全局组件来使用。下面是具体的步骤,从创建组件到全局注册和使用的完整过程。
1. 创建 SvgIcon.vue 组件
首先,你需要一个通用的 SVG 组件,这样可以动态加载 SVG 图标。
<!-- 文件路径:src/components/SvgIcon.vue -->
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
export default {
name: 'SvgIcon',
props: {
iconName: {
type: String,
required: true,
},
svgClass: {
type: String,
default: 'svg-icon',
},
},
};
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
fill: currentColor;
}
</style>
解释:
iconName:表示 SVG 图标的名称,用来引用具体的图标。<use>标签用于引用 SVG 图标的 ID。svgClass:可以传入自定义的 CSS 类来控制样式。
2. 自动加载 SVG 图标
为了批量加载 SVG 文件,你可以使用 Webpack 的 require.context 来导入所有的 SVG 文件。创建一个 svgIcons.js 插件文件来处理这个过程。
// 文件路径:src/plugins/svgIcons.js
import SvgIcon from '@/components/SvgIcon.vue';
export default {
install(app) {
// 全局注册 SvgIcon 组件
app.component('SvgIcon', SvgIcon);
// 动态加载 SVG 图标
const requireAll = (requireContext) =>
requireContext.keys().map(requireContext);
// 加载 src/icons/svg 目录下的所有 .svg 文件
const req = require.context('@/icons/svg', false, /\.svg$/);
requireAll(req);
},
};
解释:
- 这里的
require.context方法会加载src/icons/svg目录下的所有.svg文件。 app.component('SvgIcon', SvgIcon)全局注册了SvgIcon组件。
3. 在 main.js 中注册插件
打开项目的入口文件 main.js 或 main.ts,并注册这个插件。
// main.js 或 main.ts
import { createApp } from 'vue';
import App from './App.vue';
import svgIconsPlugin from './plugins/svgIcons'; // 引入 SVG 插件
const app = createApp(App);
app.use(svgIconsPlugin); // 注册 SVG 插件
app.mount('#app');
4. 存放 SVG 文件
在 src/icons/svg 目录下放置你的 .svg 文件。例如,如果你有一个 example.svg,它的内容可能是这样的:
<!-- 文件路径:src/icons/svg/example.svg -->
<svg t="1234567890" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#000000">
<path d="M512 0C229.23 0 0 229.23 0 512s229.23 512 512 512 512-229.23 512-512S794.77 0 512 0z m0 952c-243.36 0-440-196.64-440-440S268.64 72 512 72s440 196.64 440 440-196.64 440-440 440z"></path>
</svg>
5. 在模板中使用 SVG 图标
现在,你可以在任意模板中使用 SvgIcon 组件来显示你的 SVG 图标。示例如下:
<template>
<div>
<!-- 使用 SvgIcon 组件,iconName 对应 SVG 文件中的 ID -->
<SvgIcon iconName="#example" class="custom-svg-icon" />
</div>
</template>
<style>
.custom-svg-icon {
width: 24px;
height: 24px;
color: #42b983;
}
</style>
解释:
<SvgIcon iconName="#example" />:iconName属性中的#example对应的是example.svg文件名。通常,#example代表 SVG 文件内部的 ID。
6. 使用 Vite 项目(可选)
如果你使用的是 Vite 构建工具,可以使用 vite-plugin-svg-icons 插件,这样可以更加方便地管理 SVG 图标。以下是一些简单的步骤:
-
安装插件:
npm install vite-plugin-svg-icons -D -
配置 Vite:
修改
vite.config.js文件,添加插件配置:import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; import path from 'path'; export default defineConfig({ plugins: [ vue(), createSvgIconsPlugin({ iconDirs: [path.resolve(process.cwd(), 'src/icons/svg')], symbolId: 'icon-[name]', }), ], });