
amis Icon 图标组件完整指南字体图标、SVG、URL 与 FontAwesome 多版本适配【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis导读本文基于 amis 低代码框架的 Icon 图标组件文档系统讲解如何在 JSON Schema 中配置图标覆盖 fontawesome v4/v5/v6 字体图标、iconfont 图标库、SVG/URL 图标、颜色与尺寸控制以及基于onEvent的交互事件。结合 Icon 渲染器源码 与 Icon 基础组件源码梳理图标解析优先级、vendor前缀拼接逻辑与registerIcon扩展机制帮助你用一份 JSON 在页面中灵活接入任何图标体系。Icon 组件是什么Icon 是 amis 内置的基础展示组件通过type: icon声明用于在页面中渲染图标或符号。它的核心特点是基于字体iconfont/fontawesome与 SVG 实现因此图标的颜色、大小可以直接用文字相关的 CSS 类或样式控制无需单独维护图片资源。从 Icon.tsx 渲染器源码 可以看到渲染器默认值为static defaultProps: PartialIconProps { icon: , vendor: fa };即默认按fontawesome v4处理 icon 名称这一点在属性表、源码实现与下方实战示例中会反复体现。React 工程注意在纯 React 项目中使用 Icon 组件需要额外引入fortawesome/fontawesome-free并在入口代码中执行import fortawesome/fontawesome-free/css/all.css同时还需要配套的 webpack 配置字体文件 loader 等。仓库内 examples 目录 与 amis-react-starter 中给出了完整接入示例接入 amis SDK 或完整 npm 包时通常无需关心该步骤。基本使用在页面body中直接声明即可渲染一个图标{ type: page, body: { type: icon, icon: cloud } }icon传入cloud在默认vendor: fa下最终渲染的 DOM 会带上fa fa-cloud类名前缀拼接逻辑详见下文“vendor 解析原理”。推荐的内置图标名称除了 fontawesomeamis 还内置了一批通过registerIcon注册的 SVG 图标。查看 packages/amis-ui/src/components/icons.tsx 中大量registerIcon(...)调用可直接使用的名称包括close、check、plus、minus、search、setting、home、folder、calendar、clock、download、upload、refresh、reload、edit、trash、filter、star、success、fail、info、warning、question、back、down、left-arrow、right-arrow、copy、location、menu、date、function等数十个常用图标。这些名称不依赖任何字体文件开箱即用。颜色及大小调整Icon 基于字体实现所以可以通过文字颜色或文字大小来直接控制它不需要额外的图片属性。{ type: page, body: { type: icon, icon: cloud, className: text-info text-xl } }className用于指定外层 CSS 类名text-info是 amis 内置的信息色文本类还有text-primary、text-success、text-warning、text-danger等同族类text-xl是 amis 内置的字号类还有text-xs、text-sm、text-base、text-lg等具体字号阶梯可参考 style 目录下的排版规范。对于 SVG/URL 图标Icon基础组件同样支持传入width/height/style直接控制尺寸见 icons.tsx 组件实现if (width ! undefined) { style {...style, width}; } if (height ! undefined) { style {...style, height}; }使用图标链接URL / SVG 文件icon字段除了图标名称还可以直接传一个 URL 地址。你可以从 iconfont 等网站下载所需的svg 文件上传到自己的服务器/CDN然后把地址填进来{ type: page, body: { type: icon, icon: https://suda.cdn.bcebos.com/images%2F2021-01%2Fdiamond.svg } }底层处理逻辑在 icons.tsx 中URL 判定规则是icon为字符串且包含.字符即视为链接交给LinkIcon组件处理而LinkIcon同文件 L313-L370做了两件事若地址以.svg结尾且配置了自定义 vendor 处理函数vendorFn会先fetch获取 SVG 文本尝试转为内联svg渲染失败则回退为img方式否则直接用img src{icon}渲染。这意味着同一条 URL 配置最终可能渲染为内联 SVG 或 img 标签取决于是否命中 vendor 处理逻辑同时也说明 URL 图标天然支持任意静态图资源png、jpg、svg 等。使用 fontawesome v5 / v6 版本icon默认支持fontawesome v4vendor默认值为fa。想要使用v5 或 v6版本时只需把vendor设置为空字符串此时 amis 不再拼接任何前缀icon中写什么类名就渲染什么类名因此可以无缝兼容 fontawesome v5/v6以及其他任何采用前缀 名称约定的图标框架。fontawesome v5v5 使用far/fas等作为前缀类名写法为far fa-xxx/fas fa-xxx{ type:page, body:[ { type:icon, icon:far fa-address-book, vendor: }, { type:icon, icon:fas fa-address-book, vendor: }, { type:icon, icon:far fa-address-book, vendor:, className: text-info text-xl }, { type:icon, icon:fas fa-address-book, vendor:, className: text-info text-xl }, { type: divider }, { type:icon, icon:far fa-bell, vendor: }, { type:icon, icon:fas fa-bell, vendor: }, { type:icon, icon:far fa-bell, vendor:, className: text-info text-xl }, { type:icon, icon:fas fa-bell, vendor:, className: text-info text-xl }, { type: divider }, { type:icon, icon:far fa-plus, vendor: }, { type:icon, icon:fas fa-plus, vendor: }, { type:icon, icon:far fa-plus, vendor:, className: text-info text-xl }, { type:icon, icon:fas fa-plus, vendor:, className: text-info text-xl }, { type: divider }, { type:icon, icon:far fa-question-circle, vendor: }, { type:icon, icon:fas fa-question-circle, vendor: }, { type:icon, icon:far fa-question-circle, vendor:, className: text-info text-xl }, { type:icon, icon:fas fa-question-circle, vendor:, className: text-info text-xl } ] }要点farregular与fassolid在同一个字体文件下可混合使用视觉上区分描边与实心风格同一图标可以靠className如text-info text-xl放大并着色注意vendor: 与className互不冲突可以组合使用divider用于在body数组中对图标进行视觉分组。fontawesome v6v6 使用fa-regular/fa-solid等作为前缀{ type:page, body:[ { type:icon, icon:fa-regular fa-address-book, vendor: }, { type:icon, icon:fa-solid fa-address-book, vendor: }, { type:icon, icon:fa-regular fa-address-book, vendor:, className: text-info text-xl }, { type:icon, icon:fa-solid fa-address-book, vendor:, className: text-info text-xl } ] }vendor 解析原理查看 icons.tsx 的 vendor 前缀拼接逻辑可以看到三种取值行为完全由代码定义let iconPrefix ; if (vendor iconfont) { iconPrefix iconfont icon-${icon}; } else if (vendor fa) { // 默认是 fontawesome v4兼容之前配置 iconPrefix ${vendor} ${vendor}-${icon}; } else { // 如果 vendor 为空则不设置前缀这样可以支持 fontawesome v5、v6 或者其他框架 iconPrefix icon; }vendor 取值行为典型类名结果fa默认拼接fa fa-icon兼容 fontawesome v4fa fa-cloudiconfont拼接iconfont icon-iconiconfont icon-cloud空字符串不拼接前缀直接使用icon原文far fa-address-book等这就是v5/v6 必须把 vendor 设为空字符串的根本原因am-is 只负责把类名原样输出具体的字体渲染交给已引入的 FontAwesome 样式表完成。使用 iconfont 与自定义图标库vendor: iconfont用于接入 iconfont.cn 生成的图标字体工程。此时 amis 会为icon名称拼接iconfont icon-前缀只要你的页面中已加载对应的 iconfont 字体样式font-face与.icon-xxx类定义即可正常渲染。另外amis 还提供两层更灵活的自定义图标能力registerIcon内置 SVG 扩展通过 registerIcon 函数 可以把任意 React 组件注册为命名图标之后直接以该名称在icon中使用import {registerIcon} from amis-ui; registerIcon(my-logo, MyLogoComponent); // 之后 {type: icon, icon: my-logo} 即可渲染 MyLogoComponent从源码可见命名图标在渲染时会走getIcon(icon)查表分支icons.tsx L496-L509查不到再依次尝试 schema 对象、SVG 字符串、URL、字体类名。registerCustomVendor自定义 vendor 处理器在 packages/amis-core/src/utils/icon.tsx 中提供了registerCustomVendor(vendor, fn)可以为一个自定义 vendor 名注册处理函数对图标字符串/SVG 做二次加工例如替换颜色、注入样式。Icon组件内部通过getCustomVendor(vendor)获取该函数icons.tsx L405在渲染内联 SVG 前调用实现针对特定图标体系做深度定制。图标解析优先级源码级梳理综合 icons.tsx 的实现icon字段的值会按以下顺序尝试解析React 元素icon直接是 ReactNode 时克隆并挂载事件、类名、样式iconContentCSS 变量图标通过getComputedStyle读取 CSScontent中内嵌的 SVG 字符串并注入 DOM已注册命名图标registerIcon注册过的名称命中getIcon(icon)分支Schema 对象icon 选择器产物{type: icon, icon: {id, name, svg}}会被解包后继续处理SVG symbol 引用id以svg-开头的对象若页面存在对应symbol则用use xlink:href#...渲染否则回退为 svg 字符串内联 SVG 字符串以svg开头的字符串会被解析为内联 SVG 渲染URL 链接包含.的字符串按链接渲染img或内联 SVG普通字符串字体类名按vendor拼接前缀后输出i标签兜底以上都不满足时输出span classtext-danger没有 icon {icon}/span提示。这个优先级顺序意味着命名图标 URL 字体类名同名字段在不同的值形态下走完全不同的渲染管线理解它对排查图标不显示问题非常关键。事件交互click / mouseenter / mouseleave该能力需要 amis2.6.1 及以上版本。Icon 组件会对外派发以下事件可通过onEvent监听并通过actions配置执行的动作在actions中可用${事件参数名}或${event.data.[事件参数名]}获取事件产生数据。完整的事件动作机制见 事件动作文档。事件名称事件参数说明click-点击时触发mouseenter-鼠标移入时触发mouseleave-鼠标移出时触发这三个事件在渲染器中分别对应handleClick、handleMouseEnter、handleMouseLeave统一通过dispatchEvent派发见 Icon.tsx 渲染器 L53-L69。click鼠标点击时触发可通过${event.context.nativeEvent}获取原始鼠标事件对象{ type: icon, icon: cloud, onEvent: { click: { actions: [ { actionType: toast, args: { msgType: info, msg: ${event.context.nativeEvent.target.className} } } ] } } }mouseenter鼠标移入时触发{ type: icon, icon: cloud, onEvent: { mouseenter: { actions: [ { actionType: toast, args: { msgType: info, msg: ${event.context.nativeEvent.type} } } ] } } }mouseleave鼠标移出时触发{ type: icon, icon: cloud, onEvent: { mouseleave: { actions: [ { actionType: toast, args: { msgType: info, msg: ${event.context.nativeEvent.type} } } ] } } }除了上述三个事件Icon基础组件本身还透传了onMouseOver、onMouseOut、onMouseDown、onFocus、onBlur、onTouchStart等更多 DOM 事件见 icons.tsx L434-L450在渲染器层暂未全部对外暴露但为上层扩展保留了能力。属性表完整配置参考属性名类型默认值说明typestringicon指定组件类型classNamestring外层 CSS 类名常用于配合text-info、text-xl等控制颜色与尺寸icon模板icon 名称支持 fontawesome v4、通过registerIcon注册的 icon、URL 地址或 SVG 字符串vendorstringicon 类型默认为fafontawesome v4也支持iconfont如果是 fontawesome v5 或其他框架设为空字符串补充说明icon同时支持 模板语法渲染器中对字符串型icon会先执行filter(this.props.icon, data)做变量替换见 Icon.tsx L83-L85因此可以动态绑定数据icon: ${iconName}vendor的类型定义在渲染器 Schema 中为iconfont | fa | 见 Icon.tsx L35渲染器还支持badge角标AMISIconSchema.badge与themeCss主题定制能力通过withBadge装饰器与CustomStyle组件注入Icon.tsx L106-L128可以在图标上叠加数字角标并支持主题样式。常见问题与排查建议v5/v6 图标不显示检查是否把vendor设为并确认页面已正确引入对应版本的 FontAwesome 样式React 工程需import fortawesome/fontawesome-free/css/all.css。iconfont 图标不显示确认vendor: iconfont并确保 iconfont 工程的font-face与字体文件已加载且icon名称与工程中的 class 名一致。URL 图标不显示确认地址可访问、路径包含.源码以.判定为 URLSVG 文件建议直接使用或经自定义 vendor 转内联渲染。想要用项目自定义图标优先用registerIcon注册 React 组件或在 IconSelect / IconPicker 表单组件 的图标集合中扩展。点击事件不触发确认 amis 版本 ≥ 2.6.1并检查onEvent是否挂在icon节点自身而非外层容器。总结Icon 组件以一段 JSON 一个 icon 名称/地址完成图标渲染核心设计是字体类名透传 多形态输入归一默认vendor: fa兼容 fontawesome v4vendor: iconfont接入 iconfont 字体图标vendor: 透传类名兼容 fontawesome v5/v6 及其他图标框架URL / SVG 字符串 / registerIcon 命名图标 / 自定义 vendor 处理器共同构成完整的扩展链路颜色、尺寸复用文本样式体系text-*类交互事件click / mouseenter / mouseleave通过onEvent与动作系统打通。相关的核心源码路径渲染器 packages/amis/src/renderers/Icon.tsx、基础组件与内置图标注册 packages/amis-ui/src/components/icons.tsx、自定义 vendor 机制 packages/amis-core/src/utils/icon.tsx以及内置 SVG 图标资源目录 packages/amis-ui/src/icons。结合 Icon 官方文档 与 事件动作文档 可进一步查阅完整用法。【免费下载链接】amis前端低代码框架通过 JSON 配置就能生成各种页面。项目地址: https://gitcode.com/GitHub_Trending/am/amis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考