Vue 3 项目全局管理和使用 SVG 图标

1,259 阅读2分钟

在 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.jsmain.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 图标。以下是一些简单的步骤:

  1. 安装插件:

    npm install vite-plugin-svg-icons -D
    
  2. 配置 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]',
        }),
      ],
    });