vue3+vite中svg的正确使用方式

1,382 阅读1分钟

前言

SVG代表可缩放矢量图形(Scalable Vector Graphics)。它是一种用于描述二维图形和图像的XML(可扩展标记语言)标准。下面我们就简单介绍一个用svg来做icon图标!


1. 安装依赖

npm i vite-plugin-svg-icons

npm i fast-glob

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'// 引入path模块

export default defineConfig({
  plugins: [vue(),
   createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [path.resolve(process.cwd(), 'src/icons')],
      // 指定symbolId格式
      symbolId: 'icon-[dir]-[name]',
    }),
  ],
})

3. 封装组件

  • 在components中新建一个svg组件
  • components/SvgIcon/index.vue
<script setup>
</script>
<template>
    <svg aria-hidden="true" class="svg-icon" >
      <use :xlink:href="symbolId" />
    </svg>
  </template>
  
  <script setup>
  import { computed } from 'vue'
  const props = defineProps({
    prefix: {
      type: String,
      default: 'icon'
    },
    name: {
      type: String,
      required: true
    },
    size: {
      type: String,
      default: '1em'
    }
   
  })
  const symbolId = computed(() => `#${props.prefix}-${props.name}`)
  </script>
  
  <style scope >
  .svg-icon {
    fill: currentColor; 
    overflow: hidden;
    width: v-bind(size);
    height: v-bind(size) ;
  }
  </style>

4. 组件注册

  • 在main.js中引入该组件, 并注册为全局组件
import { createApp } from 'vue'
import App from './App.vue'
import SvgIcon   from "./components/SvgIcon/index.vue";
import 'virtual:svg-icons-register'
createApp(App).component('SvgIcon', SvgIcon).mount('#app')

5. svg图标

  • 新建一个 icons 文件夹 ,用来存储所有svg的文件内容
  • src/icons/bug.svg

以下为示例svg文件,可直接使用


<svg t="1651119031318" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8881" width="200" height="200"><path d="M940 512H792V412c76.8 0 139-62.2 139-139 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 34.8-28.2 63-63 63H232c-34.8 0-63-28.2-63-63 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 76.8 62.2 139 139 139v100H84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h148v96c0 6.5 0.2 13 0.7 19.3C164.1 728.6 116 796.7 116 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-44.2 23.9-82.9 59.6-103.7 6 17.2 13.6 33.6 22.7 49 24.3 41.5 59 76.2 100.5 100.5S460.5 960 512 960s99.8-13.9 141.3-38.2c41.5-24.3 76.2-59 100.5-100.5 9.1-15.5 16.7-31.9 22.7-49C812.1 793.1 836 831.8 836 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-79.3-48.1-147.4-116.7-176.7 0.4-6.4 0.7-12.8 0.7-19.3v-96h148c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM716 680c0 36.8-9.7 72-27.8 102.9-17.7 30.3-43 55.6-73.3 73.3-20.1 11.8-42 20-64.9 24.3V484c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v396.5c-22.9-4.3-44.8-12.5-64.9-24.3-30.3-17.7-55.6-43-73.3-73.3C317.7 752 308 716.8 308 680V412h408v268z" p-id="8882"></path><path d="M304 280h56c4.4 0 8-3.6 8-8 0-28.3 5.9-53.2 17.1-73.5 10.6-19.4 26-34.8 45.4-45.4C450.9 142 475.7 136 504 136h16c28.3 0 53.2 5.9 73.5 17.1 19.4 10.6 34.8 26 45.4 45.4C650 218.9 656 243.7 656 272c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-40-8.8-76.7-25.9-108.1-17.2-31.5-42.5-56.8-74-74C596.7 72.8 560 64 520 64h-16c-40 0-76.7 8.8-108.1 25.9-31.5 17.2-56.8 42.5-74 74C304.8 195.3 296 232 296 272c0 4.4 3.6 8 8 8z" p-id="8883"></path></svg>

6. svg组件使用

svg-icon组件中直接使用svg文件名即可

<svg-icon name="bug"  />

效果展示

image.png


以上就是关于svg文件的一个简单使用 , 如有不对 , 欢迎指正