vue3+vite+ts 图标封装3种方案

2023-11-13

一、使用 iconify 图标库

Icon Sets • Iconify

Icônes (icones.js.org)

1. 下载插件

iconify 组件封装

pnpm install @iconify/vue -D

按需自动导入图标组件

pnpm install unplugin-icons -D

按需自动导入组件(可选)

pnpm install unplugin-vue-components -D

2. 配置 vite.config.ts

import Vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'
import Icons from 'unplugin-icons/vite'
import IconsResolver from 'unplugin-icons/resolver'

export default defineConfig {
	plugins: [
	  Vue(),
    Components({
      // 自动按需导入组件目录
      dirs: ["src/components"],
      resolvers: [
        // 自动按需加载iconify图标库图标
        IconsResolver()
      ]
    })
    Icons({
      // 自动安装图标
      autoInstall: true
    })
  ]
}

3. 使用

3.1 方式 1

组件内直接使用

<i-图标集-标图名/>
如Element Plus的图标: <i-ep-user/>
如Ant Design的图标: <i-ant-design-user-outlined/>

3.2 方式 2

封装组件 IconifyIcon,目录 src\components\IconifyIcon\index.vue

<script setup lang="ts" name="IconifyIcon">
import { Icon } from "@iconify/vue";
import type { CSSProperties } from "vue";

interface IconifyProps {
  name: string; // 图标的名称 ==> 必传
  color?: string; // 图标的颜色 ==> 非必传
  iconStyle?: CSSProperties; // 图标的样式 ==> 非必传
}

const props = withDefaults(defineProps<IconifyProps>(), {
  iconStyle: () => ({ width: "20px", height: "20px" }),
});
</script>

<template>
  <Icon :icon="props.name" :color="props.color" :style="props.iconStyle" />
</template>

<style>
svg {
  display: inline-block;
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

组件内使用

<script setup lang="ts" name="IconifyIcon">
import SvgIcon from "@/components/IconifyIcon/index.vue";

const iconStyle = { width: "100px", height: "100px", color: "#0d9488" };
</script>

<template>
	<IconifyIcon name="ep:menu" color="#0d9488" :icon-style="iconStyle" />
</template>

二、使用 iconfont 图标库

https://www.iconfont.cn/

1. 下载 iconfont.js

在这里插入图片描述

2. 将 iconfont.js 放入项目并全局引入

main.ts引入

import "@/assets/icons/iconfont/iconfont.js";

3. 下载并配置自动按需导入插件(可选)

pnpm install unplugin-vue-components -D
// vite.config.ts

import Vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'

export default defineConfig {
  plugins: [
    Vue(),
    Components({
      // 自动按需导入组件目录
      dirs: ["src/components"]
    })
  ]
}

4. 封装公共图标组件

封装组件 SvgIcon, 目录 src\components\SvgIcon\index.vue

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

interface SvgProps {
	name: string; // 图标的名称 ==> 必传
	prefix?: string; // 图标的前缀 ==> 非必传(默认为"icon")
	iconStyle?: CSSProperties; // 图标的样式 ==> 非必传
}

// 接收父组件参数并设置默认值
const props = withDefaults(defineProps<SvgProps>(), {
	prefix: "icon",
	iconStyle: () => ({ width: "20px", height: "20px" })
});

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

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

<style scoped>
svg {
	width: 1em;
	height: 1em;
	overflow: hidden;
	vertical-align: -0.15em;
	fill: currentColor;
}
</style>

5. 组件内使用

<script setup lang="ts" name="svgIcon">
import SvgIcon from "@/components/SvgIcon/index.vue";

const iconStyle = { width: "100px", height: "100px", color: "#0d9488" };
</script>

<template>
	<SvgIcon name="menu" :iconStyle="iconStyle" />
</template>

三、使用本地 svg 图标

1. 下载插件

pnpm install vite-plugin-svg-icons -D

自动按需导入(可选)

pnpm install unplugin-vue-cmponents -D

2. 配置 vite.config.ts

import Vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'

export default defineConfig {
  plugins: [
    Vue(),
    Components({
      // 自动按需导入组件目录
      dirs: ["src/components"]
    }),
    createSvgIconsPlugin({
      // 配置路径, 项目存放svg的目录
      iconDirs: [resolve(process.cwd(), 'src/assets/icons/svg')],
      symbolId: 'icon-[dir]-[name]'
    })
  ]
}

3. 封装使用

与 “二、使用 iconfont 图标库” 共用同一组件。(本质都是SVG图标公共组件)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3+vite+ts 图标封装3种方案 的相关文章

随机推荐

  • SpringBoot:Druid 管理界面配置

    SpringBoot MyBatis MySQL Druid PageHeler 核心jar类
  • Python深度学习之VAE

    Deep Learning with Python 这篇文章是我学习 Deep Learning with Python 第二版 Fran ois Chollet 著 时写的系列笔记之一 文章的内容是从 Jupyter notebooks
  • springboot子模块 @Autowired无法找到其他模块的接口和类的解决方法

    在main的启动类上添加 SpringBootApplication scanBasePackages com shangsheng 或者 ComponentScan com shangsheng 注意 只能写两个包的连接点 不能写到最低包
  • 基数排序(Radix Sort)-- 特殊排序算法

    1 基数排序 Radix Sort 基数排序是按照低位先排序 然后收集 再按照高位排序 然后再收集 依次类推 直到最高位 有时候有些属性是有优先级顺序的 先按低优先级排序 再按高优先级排序 最后的次序就是高优先级高的在前 高优先级相同的低优
  • webService接口对接医院lis系统接口

    文章目录 1 应用场景 2 http协议简述 3 webService协议 soup简述 4 发送webService请求 4 1建立HttpUtils工具类 来发送post请求 4 2 调用医院给的url和xml内容 5 接收webSer
  • DC-DC开关电源 拓扑结构(BUCK BOOST BUCK-BOOST)电路

    比较粗略的BUCK BOOST电路的分析 http tech hqew com fangan 522451 http blog csdn net u011388550 article details 23841023 这个还是不错的 htt
  • group by的工作原理和优化思路

    引入 日常开发中 我们经常会使用到group by 你是否知道group by的工作原理呢 group by和having有什么区别呢 group by的优化思路是怎样的呢 使用group by有哪些需要注意的问题呢 使用group by的
  • 下载技巧汇总

    目录 5 下载资源链接 4 下载工具 Free Download Manager 1 1用cmd下载百度网盘中资料 1 2 在网上找到资源用迅雷下载 结果出现 应版权方要求 文件无法下载 的字样 1 3 下载搜索方法 2 查找资源地址 3
  • localhost 对应IP 127.0.0.1

    在使用tomcat gdb等工具调试时会输入localhost localhost 什么意思呢 localhost 对应 映射着一个IP地址 127 0 0 1 代表PC端上的本地服务器 使用的端口号 8080 8084 8089
  • springboot学习(十一)整合JDBC

    之前拿的那个项目都是没有数据库的 这里涉及到整合数据库进来 springboot工程初始化要勾选SQL里面的jdbc api和MySQL 你要是别的数据库就勾选对应的 对于数据访问层 无论是 SQL 关系型数据库 还是 NOSQL 非关系型
  • Kafka eagle的介绍及安装(基于linux环境)

    kafka eagle kafka鹰 是一款由国内公司开源的Kafka集群监控系统 用于监控 Kafka 集群中 Topic 被消费的情况 包含 Lag 的产生 Offset 的变动 Partition 的分布 Owner Topic 被创
  • PCB走线辟谣总结,究竟应该怎么找拐角?

    现在但凡打开 SoC原厂的PCBLayout Guide 都会提及到高速信号的走线的拐角角度问题 都会说高速信号不要以直角走线 要以 45 度角走线 并且会说走圆弧会比 45 度拐角更好 事实是不是这样 PCB 走线角度该怎样设置 是走 4
  • java将属性设置为私有,在给其添加get/set方法和直接把属性设置成public有什么区别

    现在以信用卡为例简单介绍下 public class TestEncapsulation public sataic void main String args CreditCard card new CreditCard System o
  • 如何更改Visual Studio 2019的语言

    第0步 开启Visual Studio 2019 第1步 工具 gt 获取工具和功能 第2步 下载语言包 等待下载 第3步 设置语言 工具 Tools gt 选项 Options 然后重启 VS 就可以看到变化了
  • MediaMetadataRetriever类取得媒体文件信息

    http blog csdn net ameyume article details 7849641 API说明 MediaMetadataRetriever class provides a unified interface for r
  • Java内存管理和面向对象

    Java内存管理 Java的内存管理是自动化的 通过垃圾回收器 Garbage Collector 简称GC 来管理内存分配和释放 在本教程中 我们将探讨Java中的内存管理概念 垃圾回收和一些内存管理相关的最佳实践 步骤1 Java的内存
  • 数据集【NO.10】天池布匹瑕疵检测

    写在前面 数据集对应应用场景 不同的应用场景有不同的检测难点以及对应改进方法 本系列整理汇总领域内的数据集 方便大家下载数据集 若无法下载可关注后私信领取 关注免费领取整理好的数据集资料 今天分享一个非常好的非常小众的研究方向 有应用创新
  • 分布式强一致算法 —— Raft算法

    背景 Paxos算法是最早的强一致性算法 1990年被Leslie Lamport提出 但是由于其难以理解和实现 导致没有被广泛使用 因此 2013年Raft算法被提出 功能与Paxos算法相同 更易于理解 实现简单 因此迅速被广泛推广使用
  • 嵌入式linux驱动之路19:U-Boot 移植(2)

    uboot 的最终目的就是启动 Linux 内核 所以需要通过启动 Linux 内核来判断 uboot 移植是否成功 在启动 Linux 内核之前我们先来学习两个重要的环境变量 bootcmd 和 bootargs bootcmd 环境变量
  • vue3+vite+ts 图标封装3种方案

    目录 一 使用 iconify 图标库 1 下载插件 2 配置 vite config ts 3 使用 3 1 方式 1 3 2 方式 2 二 使用 iconfont 图标库 1 下载 iconfont js 2 将 iconfont js