vue3+vite+ts项目 应该怎么使用svg图标

951 阅读1分钟

使用vite+ts开发vue3项目 怎么使用svg图标比较好

在项目开发中,svg图标的使用是非常常见的,可以在代码中直接引入svg图标,但是svg图标是一串很长的字符串,直接在代码中使用对阅读代码不友好,影响代码直观性,所以可以使用vite插件 vite-plugin-svg-icons封装成SvgIcon组件

1.项目安装 vite-plugin-svg-icons 依赖 注:为了解决vite运行时报错,还需要安装 fast-glob

yarn add fast-glob yarn add vite-plugin-svg-icons 或者 npm install fast-glob npm install vite-plugin-svg-icons

2.vite.config.ts 中配置

import { defineConfig } from 'vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
export default defineConfig(() => {
  return {
    plugins: [
      vue(),
      createSvgIconsPlugin({
        // 指定存放svg的文件夹路径
        iconDirs: [resolve(process.cwd(), 'src/assets/svg/icons')],
        // 指定symbolId格式
        symbolId: 'icon-[name]',
      }),
    ],
    ...
  }
})

3.在项目中创建存放svg文件夹 例如:src/assets/svg/icons,将svg图标存储到该文件夹下面即可

4.在svg项目下创建index.vue文件

<script lang="ts" setup>
import { computed } from 'vue'
const props = defineProps({
  name: {
    type: String,
    required: true,
  },
  color: {
    type: String,
    default: '',
  },
})
const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {
  if (props.name) return `svg-icon icon-${props.name}`
  return 'svg-icon'
})
</script>
<template>
  <svg :class="svgClass" v-bind="$attrs" :style="{ color: color }">
     <!-- use 元素在 SVG 文档内取得目标节点,并在别的地方复制它们 -->
    <use :xlink:href="iconName"></use>
  </svg>
</template>
<style lang="less">
.svg-icon {
  width: 1em;
  height: 1em;
  // 图标基线问题
  vertical-align: middle;
  // 定义svg图标颜色,currentColor是一个变量,表示当前元素的color值,如果当前元素未设置color值,则从父元素继承
  fill: currentColor;
  overflow: hidden;
}
</style>

5.在main.ts中引入

// svg引入
import svgIcon from '@/assets/svg/index.vue'
// 虚拟模块的引入方式,用于给脚手架插件在打包和开发时做相应的处理,如果没有这行代码,svg图标将无法正常展示
import 'virtual:svg-icons-register'
import App from './App.vue'
const app = createApp(App)
// 注册为全局组件
app.component('svg-icon', svgIcon)

6.在组件中使用,name是对应的svg图标文件名称,color是图标显示的颜色

<template>
  <svg-icon name="addUser" color="#eee" />
</template>