批量导入svg文件作为图标使用(vue3)vite-plugin-svg-icons插件的具体应用

news/2024/7/10 0:54:40 标签: vue, javascript, node.js

目录

  • 需求
  • svg使用简述
  • 插件使用简述
  • 实现
  • 安装插件
  • 1、配置vite.config.ts
  • 2、src/main.ts引入注册脚本
  • 3、写个icon组件
  • 4、使用组件

需求

vue3项目中,需要批量导入某个文件夹内数量不确定的svg文件用来作为图标,开发完成后能够通过增减文件夹内的svg文件,从而影响图标的数量。

svg使用简述

svg是一种 xml语言,svg作为html标签使用的时候,除了svg标签<svg> <path d="*"/> </svg><img src="svg_url">外,还有很多方式可以使用。
本次仅使用其中的symbol属性详情参阅相关文档 MDN-svg

<symbol>元素用来在document中生成图形模板,提供给<use>元素实例化显示。

  1. <symbol>元素本身是隐藏的,实例化后的元素才会显示
  2. <symbol>元素仅需插入一次,可多次通过<use>复用
  3. < use xlink:href=“#symId” >标签属性xlink:href与< symbol id=“symId” >标签属性id相对应

插件使用简述

vite-plugin-svg-icons是一个vite插件,提供轻松导入svg文件作为symbol元素并插入到document中的功能。
使用起来也十分容易,只需要在vite.config.ts中加个配置,然后在src/main.ts中引入即可
详情参阅 插件中文文档

实现

原本我想使用vite提供的批量导入文件来实现import.meta.glob('/src/**/*.svg')
不过这种方式需要写一大堆异步方法去解决文件动态导入的问题,而且用户体验并不好,还引发了vue3报issue
所以最终选择使用插件在编译的时候就导入所有svg文件,解决了动态导入的问题,让业务逻辑更流畅

安装插件

插件官网
插件中文文档

npm i vite-plugin-svg-icons -D

1、配置vite.config.ts

javascript">import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'

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

2、src/main.ts引入注册脚本

javascript">import 'virtual:svg-icons-register'

到这里svg 雪碧图就已经生成到页面的body中了
在这里插入图片描述

3、写个icon组件

接收一个name参数,对应symbolid属性

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

<script setup lang="ts">javascript">
import { computed } from 'vue';

interface Props {
    name: string;
}

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

4、使用组件

在页面里使用组件

<template>
    <el-icon :size="32">
    	<!-- name值和文件名对应 -->
        <SvgIcon name="404" />
    </el-icon>
</template>

<script setup lang="ts">javascript">
// 导入组件
import SvgIcon from '@/components/SvgIcon.vue';

</script>

图标出来了
在这里插入图片描述

如果需要批量导入

<template>
	<template v-for="(e, i) in svgList" :key="i">
	    <el-icon :size="32">
	        <component :is="e.module" :name="e.name"></component>
	    </el-icon>
	</template>
</template>

<script setup lang="ts">javascript">
import SvgIcon from '@/components/SvgIcon.vue';

// 引入/src/assets/icon-svg/文件夹下的所有svg文件
const svgModules = import.meta.glob('/src/assets/icon-svg/*.svg');
const svgList = Object.keys(svgModules).map((key) => ({
    name: key.replace(/^.*\/(\S+)\..*/, '$1'),
    module: SvgIcon,
}));
</script>

然后图标就有了
在这里插入图片描述


http://www.niftyadmin.cn/n/5473711.html

相关文章

vos3000安装完后登陆是红灯怎么办

概述 VOS3000安装完成后登录界面显示红灯可能是由多种原因造成的&#xff0c;这个问题涉及到VOS客户端与服务器之间的TCP连接状态。根据搜索结果&#xff0c;TCP连接一旦断开&#xff0c;服务器和软交换的状态灯就会显示红灯。但这并不意味着VOS的服务一定出了问题&#xff0c…

xv6源码分析 002

xv6源码分析 002 今晚我们就来看看xv6提供的应用程序&#xff0c;主要是sh.c和umalloc.c 这两个文件 sh.c是xv6用来进行交互的应用程序&#xff0c;怎么说呢&#xff1f;我们可以将xv6的shell看成是一个代理&#xff08;proxy&#xff09;&#xff0c;我们将我们需要执行的命…

腾讯云添加域名后不生效

问题原因 添加域名后不生效可能是因为没有加CDN域名解析 解决步骤

设计模式——桥接模式07

桥接模式是将抽象部分与实现部分分离&#xff0c;可实现两部分的组合使用。 例如 遥控器 &#xff08;抽象部分&#xff09;与 设备&#xff08;实现部分 电视&#xff0c;空调等&#xff09;。遥控器调用的是 设备方实现的接口。 设计模式&#xff0c;一定要敲代码理解 抽象模…

CSS篇(拿来即用)-作为前端 我们如何利用好Scss预处理器提升开发效率

介绍&#xff1a;封装一套能够提高自己开发效率的Css语法&#xff0c;提升工作效率&#xff0c;剩下的时间摸鱼~ /* css中背景图片变量。 */ $IMG_URL: https://i.image.com; ***边距大小**/ $paMaSize:(1,2,3,4,5,6,7,8,10,12,13,14,15,16,18,20,22,24,25,26,28,30,32,36,38,…

Vue中如何使用Tailwind CSS样式?多次引用不成功?具体步骤怎么做?

一、安装Tailwind CSS和依赖 在你的Vue项目中安装Tailwind CSS及其依赖。你可以使用npm或yarn来安装。 npm install tailwindcsslatest postcsslatest autoprefixerlatest # 或者yarn add tailwindcsslatest postcsslatest autoprefixerlatest 二、初始化Tailwind CSS np…

fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化

为了 提供数据做后端回环优化和手动回环优化,需要保存每帧的点云和每帧的里程计为单独的文件,并且需要保存的名字为ros时间戳。 效果很好,比我自己写的手动回环模块好用 // This is an advanced implementation of the algorithm described in the // following paper: /…

【办公类-21-14】 20240406三级育婴师 344道多选题 UIBOT下载+整理

作品展示 背景需求 培训机构提供了两个理论学习素材 问题&#xff1a; 1、电子稿&#xff1a;打印页数很多&#xff0c;按章节&#xff0c;题型混在一起的&#xff0c;只有答案&#xff0c;没有说明&#xff0c; 2、APP版&#xff0c;操作方便&#xff0c;有错题集&#xff0…