【Dv3Admin】菜单管理集成阿里巴巴自定义矢量图标库

图标选择是后台管理系统中高频功能。相比用 Element UI、Ant Design 等自带的 icon 集,阿里巴巴 iconfont.cn 支持上传和管理自定义图标,并生成矢量字体,便于统一维护和扩展。

本文目标是支持自定义 iconfont 图标的展示和选择,并与表单数据联动。详细介绍如何在 Vue(或任意现代前端框架)项目中,集成阿里巴巴 iconfont 自定义图标库,并通过一个图标选择器组件进行选择和绑定图标。包含从资源获取到组件开发和注意事项的全流程经验总结。

文章目录

  • 应用场景
  • 实现方式
  • 维护建议
  • 总结

应用场景

实现一个图标选择器组件,支持显示和选择阿里巴巴 iconfont 图标库中自定义下载的图标,并能将所选图标绑定到表单数据中。
在这里插入图片描述

实现方式

从阿里巴巴 iconfont 下载图标,登录 iconfont.cn。选择需要的图标,加入项目,选择“Font class”方式。下载项目资源包,解压后获得如下文件:列出来的很重要,其他两个是在本地运行的html样例文件。

在这里插入图片描述

把上述文件都放进前端项目的 src/assets/iconfont/ 文件夹。然后调整 iconfont.css 中的字体路径,确保使用相对路径(添加 ./),比如:

src: url('./iconfont.woff2?t=xxxx') format('woff2'),url('./iconfont.woff?t=xxxx') format('woff'),url('./iconfont.ttf?t=xxxx') format('truetype');

在项目入口处引入 iconfont.css 文件,具体操作是在 src/main.ts 文件中添加以下代码:

import '/@/assets/iconfont/iconfont.css';

图标选择器组件集成在 IconSelector 组件中,增加 custom tab 页,专门用于显示自定义 iconfont 图标。通过读取 iconfont.json 文件,获取所有可用的图标 class 名(如 iconfont icon-xxx)。在 IconSelector 的 custom tab 页中,遍历这些 class 名,生成 <i class="iconfont icon-xxx"></i> 进行预览和选择。

绑定到表单在需要选择图标的表单中(如菜单管理),使用如下代码:

<el-form-item label="图标" prop="icon"><IconSelector clearable v-model="menuFormData.icon" />
</el-form-item>

用户选择图标后,menuFormData.icon 会自动更新为所选图标的 class 名。

集成 iconfont 图标的核心在于自动化——我们不再手动维护所有图标 class,而是直接读取阿里巴巴 iconfont 导出的 iconfont.json 文件,通过其 glyphs 属性批量获取所有自定义图标的类名。这样,每当 iconfont 更新,图标列表都能同步刷新,极大减轻维护成本。实际开发中,通过遍历 glyphs 的 font_class 字段,将所有图标 class 名组装成可直接用于渲染的数组,为后续的图标选择器提供数据支撑。

import iconfontJson from '/@/assets/iconfont/iconfont.json';const getCustomIconfont = () => {return new Promise((resolve, reject) => {if (iconfontJson && Array.isArray(iconfontJson.glyphs)) {const sheetsIconList = iconfontJson.glyphs.filter(item => !!item.font_class).map(item => `iconfont icon-${item.font_class}`);resolve(sheetsIconList);} else {reject('未获取到值,请刷新重试');}});
};

图标渲染和选择的关键在于“可视化+交互”。通过循环生成 标签,并为每个标签赋上正确的 class,实现所有 iconfont 图标的批量预览。用户在 custom tab 页面中直观看到所有自定义图标,并且可以点击选择;选择操作则会触发事件,将目标图标的 class 名返回给业务表单。整个过程兼顾了美观性和实用性,提升了前端 UI 的可扩展性和灵活性。

<i :class="v" style="font-size: 20px;"></i>

完整 tab 示例:

<el-tab-pane lazy label="custom" name="custom"><IconList :list="fontIconSheetsFilterList" :empty="emptyDescription":prefix="state.fontIconPrefix" @get-icon="onColClick" />
</el-tab-pane>

将图标选择器和表单绑定,是为了让图标选择真正服务于业务场景。通过 v-model,所选图标的 class 名自动写入表单字段,实现数据的双向绑定。用户在选择图标时,无需关心技术细节,表单中的 icon 字段就会实时反映当前选择。这样,后端或其他前端页面只需存储和读取 icon 的 class 字符串即可,无论用于菜单、按钮还是任意 UI 组件,都实现了高内聚、低耦合的图标配置能力。

<el-form-item label="图标" prop="icon"><IconSelector clearable v-model="menuFormData.icon" />
</el-form-item>

选择后,menuFormData.icon 就会自动绑定为所选图标的 class 名,如 iconfont icon-user

维护建议

在日常维护 iconfont 图标时,每次增加或调整图标,都需要重新在 iconfont.cn 上下载最新的资源包,将 iconfont.css、字体文件和 iconfont.json 覆盖到项目的 src/assets/iconfont/ 目录下,保持所有资源同步。这样可以避免图标缺失或版本不一致导致的问题。如果遇到图标显示为小方块,建议优先重启开发服务并清理浏览器缓存,防止旧文件缓存影响正常显示。

类名一致性是保证图标正常渲染的核心。推荐始终采用 .iconfont 作为基础类名,无论是在 CSS 还是在代码中,都需要保持完全一致。例如,iconfont icon-xxx 这种组合形式,是最通用、最可靠的做法。下面是标准写法的参考:

.iconfont {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
}
// 代码中
state.fontIconList.custom = res.map((i: string) => `iconfont icon-xxx`);
// 生成的类名与 CSS 保持一致,保证图标能正常显示

如果项目需要自定义类名前缀,比如 .custom-iconfont,同样要保证 CSS 和代码里的类名写法完全对应,否则图标仍会变成小方块。自定义前缀的写法如下:

.custom-iconfont {font-family: "iconfont" !important;font-size: 16px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
}
// 代码中
state.fontIconList.custom = res.map((i: string) => `custom-iconfont icon-xxx`);
// 生成的类名需和 .custom-iconfont 一致

如果遇到图标不显示,首先建议用浏览器开发者工具检查元素的类名,确认是否和 CSS 里的类名定义完全一致,然后检查字体文件有没有正常加载(可以通过 Network 面板查看)。通常保持类名简洁统一、只用 .iconfont 前缀,并且 CSS 里只定义 .icon-xxx 类,代码中统一用 iconfont icon-xxx 组合,可以最大程度减少因类名不匹配导致的显示异常。这样做能让 iconfont 图标的集成和维护更高效、更可靠。

总结

通过引入 iconfont 自定义图标资源,实现了在 Vue 项目中图标的集中管理与选择。自定义图标与表单字段双向绑定,可视化选择界面支持批量预览与交互绑定,显著优化了图标使用体验。

维护过程中,统一的类名命名规则与资源路径配置,是确保图标正常显示的关键。自动读取 iconfont.json 生成图标列表,减少了人工维护成本,也提高了图标更新的效率。此方案在后台管理系统等多图标场景中具备高度通用性与可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89345.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NO.7数据结构树|线索二叉树|树森林二叉树转化|树森林遍历|并查集|二叉排序树|平衡二叉树|哈夫曼树|哈夫曼编码

线索二叉树 线索二叉树的基本概念 为了解决无法直接找到该结点在某种遍历序列中的前驱和后继结点的问题&#xff0c; 出现了线索二叉树。 一个二叉树通过如下的方法“穿起来” &#xff1a; 所有原本为空的右(孩子)指针改为指向该节点在某种遍历序列中的后继&#xff0c; 所有原…

R语言基础| 基本图形绘制(条形图、堆积图、分组图、填充条形图、均值条形图)

目录 一、前言 二、条形图 1. 简单的条形图 2.堆积、分组和填充条形图(柱状图) &#xff08;1&#xff09;堆积图&#xff0c;对Improved进行堆积&#xff0c;注意position“stack” &#xff08;2&#xff09;分组图&#xff0c;对Improved进行分组&#xff0c;注意posit…

SegNet:一种用于图像分割的深度卷积编码器解码器架构

教程/讲解视频点击文末名片1、什么是语义分割&#xff0c;什么是FCN 我们提出了一种新颖且实用的深度全卷积神经网络架构&#xff0c;用于语义像素级分割&#xff0c;命名为SegNet。 语义分割是指为图像中的每个像素分配一个类别标签&#xff08;如道路、天空、汽车&#xff09…

PyTorch 数据加载全攻略:从自定义数据集到模型训练

目录 一、为什么需要数据加载器&#xff1f; 二、自定义 Dataset 类 1. 核心方法解析 2. 代码实现 三、快速上手&#xff1a;TensorDataset 1. 代码示例 2. 适用场景 四、DataLoader&#xff1a;批量加载数据的利器 1. 核心参数说明 2. 代码示例 五、实战&#xff1…

Python--plist文件的读取

Python练习&#xff1a;读取Apple Plist文件 Plist文件简介 ​​定义​​&#xff1a;Apple公司创建的基于XML结构的文件格式​​特点​​&#xff1a;采用XML语法组织数据&#xff0c;可存储键值对、数组等结构化信息文件扩展名​​&#xff1a;.plist应用场景: ​​iOS系统:​…

JAVA几个注解记录

在Java中&#xff0c;Data、AllArgsConstructor和NoArgsConstructor是Lombok库提供的注解&#xff0c;用于自动生成Java类中的样板代码&#xff08;如getter、setter、构造函数等&#xff09;&#xff0c;从而减少冗余代码&#xff0c;提高开发效率。以下是它们的详细功能和使用…

js对象简介、内置对象

对象、内置对象 jarringslee 对象 对象&#xff08;object&#xff09;是js的一种引用数据类型&#xff0c;是一种无序的数据集合“ul”&#xff08;类比于数组&#xff0c;有序的数据集合“ol”&#xff09;。 基本上等于结构体。 对象的声明 //基本方法 let 对象名 {声…

【工程篇】07:如何打包conda环境并拷贝到另一台服务器上

这是一份以名为 qwen2.5-vl 的 Conda 环境为例的详细操作手册&#xff0c;指导您如何将其打包并迁移至另一台服务器。操作手册&#xff1a;迁移 Conda 环境 qwen2.5-vl 至新服务器 本文档将提供两种有效的方法来迁移您的 qwen2.5-vl 环境。请根据您的具体需求和服务器条件选择最…

rustdesk远控电脑替代todesk,平替向日葵等软件

rustdesk网页端远控电脑docker run --restart always \ --privileged \ -p 9000:9000 \ -p 21114:21114 \ -p 21115:21115 \ -p 21116:21116 \ -p 21116:21116/udp \ -p 21117:21117 \ -p 21118:21118 \ -p 21119:21119 \ -e KEYj8muHpzr2HK00zm9D94b1UFkaJ1bEiWsyA1qxb1nOA \ …

板凳-------Mysql cookbook学习 (十二--------1)

第9章 存储例程&#xff0c;触发器和计划事件 326 9.0 概述 326 9.1 创建复合语句对象 329 mysql> -- 恢复默认分隔符 mysql> DELIMITER ; mysql>mysql> DROP FUNCTION IF EXISTS avg_mail_size; Query OK, 0 rows affected (0.02 sec)mysql> DELIMITER $$ mysq…

密码学系列文(3)--分组密码

一、分组密码概述分组密码是许多系统安全的一个重要组成部分&#xff0c;可用于构造&#xff1a;拟随机数生成器流密码消息认证码(MAC)和杂凑函数消息认证技术、数据完整性机构、实体认证协议以及单钥数字签字体制的核心组成部分应用中对于分组密码的要求&#xff1a;安全性运行…

WCDB soci 查询语句

测试代码 #pragma once #include <string> #include <vector>// Assume OperationLog is a struct representing a row in the table struct OperationLog {int id;std::string op_type;std::string op_subtype;std::string details;std::string timestamp; };clas…

lesson16:Python函数的认识

目录 一、为什么需要函数&#xff1f; 1. 拒绝重复造轮子 2. 让代码像句子一样可读 3. 隔离变化&#xff0c;降低维护成本 二、函数的定义&#xff1a;编写高质量函数的5个要素 基本语法框架 1. 函数命名的黄金法则&#xff08;PEP8规范&#xff09; 2. 不可或缺的文档…

通过轮询方式使用LoRa DTU有什么缺点?

在物联网系统中&#xff0c;DTU&#xff08;Data Transfer Unit&#xff09;通常用于通过485或M-Bus等接口抄读子设备的数据&#xff0c;并将这些数据传输到平台侧。然而&#xff0c;如果DTU采用轮询方式与平台通信&#xff0c;会带来一系列问题&#xff0c;尤其是在功耗和系统…

Syntax Error: Error: PostCSS received undefined instead of CSS string

报错&#xff1a;Syntax Error: Error: PostCSS received undefined instead of CSS string npm rebuild node-sass报错&#xff1a;npm i canvas 报错 canvas2.11.2 run install node-pre-gyp install --fallback-to-build --update-binary npm install canvas --canvas_binar…

人工智能之数学基础:概率论和数理统计在机器学习的地位

概率和统计的概念概率统计是各类学科中唯一一门专门研究随机现象的规律性的学科&#xff0c;随机现象的广泛性决定了这一学科的重要性。概率论是数学的分支&#xff0c;它研究的是如何定量描述随机现象及其规律。我们之前经常在天气软件上看到&#xff1a;“今天下雨的概率是95…

第十四章 Stream API

JAVA语言引入了一个流式Stream API,这个API对集合数据进行操作&#xff0c;类似于使用SQL执行的数据库查询&#xff0c;同样可以使用Stream API并行执行操作。Stream和Collection的区别Collection:静态的内存数据结构&#xff0c;强调的是数据。Stream API:和集合相关的计算操作…

Oracle数据库各版本间的技术迭代详解

今天我想和大家聊聊一个我们可能每天都在用&#xff0c;但未必真正了解的技术——Oracle数据库的版本。如果你是企业的IT工程师&#xff0c;可能经历过“升级数据库”的头疼&#xff1b;如果你是业务负责人&#xff0c;可能疑惑过“为什么一定要换新版本”&#xff1b;甚至如果…

论文reading学习记录3 - weekly - 模块化视觉端到端ST-P3

文章目录前言一、摘要与引言二、Related Word2.1 可解释的端到端架构2.2 鸟瞰图2.3 未来预测2.4 规划三、方法3.1 感知bev特征积累3.1.1 空间融合&#xff08;帧的对齐&#xff09;3.1.2 时间融合3.2 预测&#xff1a;双路径未来建模3.3 规划&#xff1a;先验知识的整合与提炼4…

crawl4ai--bitcointalk爬虫实战项目

&#x1f4cc; 项目目标本项目旨在自动化抓取 Bitcointalk 论坛中指定板块的帖子数据&#xff08;包括主贴和所有回复&#xff09;&#xff0c;并提取出结构化信息如标题、作者、发帖时间、用户等级、活跃度、Merit 等&#xff0c;以便进一步分析或使用。本项目只供科研学习使用…