首页 > 其他分享 >【Vue】Vue3+Vite 实现 SVG 组件自动加载 icons 目录下所有文件

【Vue】Vue3+Vite 实现 SVG 组件自动加载 icons 目录下所有文件

时间:2023-06-26 20:56:45浏览次数:41  
标签:Vue plugin SVG icons svg import vite 图标

1. 安装依赖插件 vite-plugin-svg-icons

vite-plugin-svg-icons 用于生成 svg 雪碧图。
特点:
1.预加载 在项目运行时就生成所有图标,只需操作一次 dom
2.高性能 内置缓存,仅当文件被修改时才会重新生成

vite-plugin-svg-icons 官方文档

pnpm add vite-plugin-svg-icons

2. 安装 fast-glob

该软件包提供了遍历文件系统的方法,并根据Unix Bash shell使用的规则返回与一组定义的指定模式匹配的路径名,并进行了一些简化,同时以任意顺序返回结果。快速、简单、有效。

fast-glob NPM 文档

pnpm add fast-glob

3. 配置 vite.config.ts

import { defineConfig } from 'vite'
import path from "path";
import {createSvgIconsPlugin} from 'vite-plugin-svg-icons'; // vite-plugin-svg-icons 用于自动导入 svg 图标

export default defineConfig({
  plugins: [
	createSvgIconsPlugin({
		// 需要自动导入的 svg 文件目录(可自行修改)
		iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
		// 执行icon name的格式(可自行修改)
		symbolId: "icon-[dir]-[name]",
		// 更多配置请参考:https://github.com/vbenjs/vite-plugin-svg-icons/blob/HEAD/README.zh_CN.md
	}),
  ]
});

4. 在 main.ts 入口注册脚本

import "virtual:svg-icons-register"; // vite-plugin-svg-icons 插件注册,不引入会导致svg图标无法正常显示

5. 封装 SvgIcon 组件

可根据自己实际项目需要自行修改组件逻辑

<template>
	<svg :style="iconStyle" aria-hidden="true">
		<use :xlink:href="symbolId" />
	</svg>
</template>

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

interface SvgProps {
	name: string; // 图标的名称(Svg 文件名) ==> 必传
	prefix?: string; // 图标的前缀 ==> 非必传(默认为"icon")
	iconStyle?: CSSProperties; // 图标的样式 ==> 非必传
}
// 接收父组件参数并设置默认值
const props = withDefaults(defineProps<SvgProps>(), {
	prefix: "icon",
	iconStyle: () => ({ width: "50px", height: "50px" }),
});

const symbolId = computed(() => `#${props.prefix}-${props.name}`);
</script>

6. 引入组件使用

// 导入
import SvgIcon from '@/components/SvgIcon/index.vue';

// 使用
<SvgIcon :name="item.name" :iconStyle="{ width: '24px', height: '24px' }" />

参考文章

vite-plugin-svg-icons 官方文档
fast-glob NPM 文档
Vite2 + Vue3添加svg的使用并通过svg实现自定义Icon组件

标签:Vue,plugin,SVG,icons,svg,import,vite,图标
From: https://www.cnblogs.com/wx980416/p/17506673.html

相关文章

  • Vue(九):计算属性
    现在有一个需求,输入姓和名将其拼接为全名,全名要求根据姓名实时变化。下面是三种实现:1.插值语法实现<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>姓名案例-插值语法实现</title><scripttype="text/javascript"src="../js/vu......
  • vue3.0之axios使用
    //导入包importaxiosfrom"axios";//使用示例axios.post('发送请求地址',{携带变量key1:变量value1,携带变量key2:变量value2,}).then(response=>{//后端返回给前端的数据都在response.data里,可以通过“response.data.键”进行调用if(response.data.cod......
  • vue3.0之emit的使用
    主要用于跨组件传输数据,emit可以调用父组件中的自定义函数。使用方法letemit=defineEmits(['父组件自定义函数1','父组件自定义函数2','...'])//调用父组件自定义函数的执行emit('父组件自定义函数')主要逻辑在父组件中定义一个自定义函数<template><Loginv-if......
  • vue3.0之cookies的操作
    安装npminstallvue-cookiesimportVueCookiesfrom'vue-cookies'constcookies=VueCookiescookies.set('key值','字符串或变量','7d')//7d代表时间,存放7天cookies.get('key值')//取出key值对应的数据cookies.remove('ke......
  • vue编程-创建首页
    1.将elementUI组件与sass组件依赖加入到对应json中{"name":"default","version":"0.1.0","private":true,"scripts":{"serve":"vue-cli-serviceserve","build":&......
  • vue05_路由
    今日目标1.能够说出什么是路由2.能够说出前端路由的实现原理3.能够使用Vue-Router实现前端路由4.能够实现嵌套路由,动态路由5.能够实现命名路由以及编程式导航6.理解并实现后台管理案例 1.路由的概念路由的本质就是一种对应关系,比如说我们在url地址中输入我们要访问的......
  • vue08进阶
    Vue基础一、创建一个Vue应用1、应用实例每个Vue应用都是通过createApp函数创建一个新的应用实例:import{createApp}from'vue'​constapp=createApp({  //根组件选项}) 2、根组件我们传入createApp的对象实际上是一个组件,每个应用都需要一个“根组件”,......
  • vue07进阶
    Vue开始什么是vue?Vue是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue都可以胜任。下面是一个最基本的示例:import{createApp}from'vu......
  • vue06_前端工程化
    今日目标1.能够了解模块化的相关规范2.了解webpack3.了解使用Vue单文件组件4.能够搭建Vue脚手架5.掌握Element-UI的使用1.模块化的分类A.浏览器端的模块化1).AMD(AsynchronousModuleDefinition,异步模块定义)​代表产品为:Require.js​2).CMD(CommonModuleDefi......
  • vue09进阶
    Vue组件 一、组件基础组件允许我们将UI划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。在实际应用中,组件常常被组织成层层嵌套的树状结构:这和我们嵌套HTML元素的方式类似,Vue实现了自己的组件模型,使我们可以在每个组件内封装自定义内容与逻辑。Vue同样......