Vue项目实现自定义svg

82 阅读1分钟

项目目录创建一个存放svg图标的目录

image.png

下载对应的插件进行配置

npm i vite-plugin-svg-icons -D npm i fast-glob -D

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { join, resolve } from "path";
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'



// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
      vue(),
      createSvgIconsPlugin({
      		// 这个是自己配置的图标路径,指出来(自己咋配置的咋来)
          iconDirs: [resolve(process.cwd(), 'src/assets/svg')],
          // 这个表示id,按这个来就对了
          symbolId: 'icon-[dir]-[name]',
      }),
  ],
    resolve: {
        alias: {
            '@': join(__dirname, 'src'),
        }
    },
})

main.ts

import 'virtual:svg-icons-register'
import SvgIcon from "./components/SvgIcon.vue"

const app = createApp(App)

app.component("svg-icon",SvgIcon)

...

新建组件

<template>
  <svg :class="svgClass" v-bind="$attrs" :style="{ color: color }">
    <use :xlink:href="iconName" />
  </svg>
</template>

<script setup lang="ts">
import { computed, unref } from "vue";

const props = defineProps({
  name: {
    type: String,
    required: true,
  },
  color: {
    type: String,
    default: "inherit",
  },
  // 图标尺寸
  size: {
    type: [String, Number],
    default: 24,
  },
});

// 补全图标尺寸
const size = computed(() =>
  Number.isNaN(new Number(props.size).valueOf())
    ? props.size
    : props.size + "px"
);
const width = computed(() => unref(size));
const height = computed(() => unref(size));
const iconName = computed(() => `#icon-${props.name}`);
const svgClass = computed(() => {
  if (props.name) {
    return `svg-icon icon-${props.name}`;
  }
  return "svg-icon";
});
</script>

<style scoped>
.svg-icon {
  width: v-bind("width");
  height: v-bind("height");
  fill: v-bind("props.color");
  vertical-align: middle;
}
</style>

使用

<svg-icon name="error" :size="80" />