Carbon React Button 组件 v9 到 v10 迁移指南:icon 属性重构、kind 与 ref 变更全解析
Carbon React Button 组件 v9 到 v10 迁移指南icon 属性重构、kind 与 ref 变更全解析【免费下载链接】carbonA design system built by IBM项目地址: https://gitcode.com/GitHub_Trending/carbo/carbon导读本文基于 IBM Carbon Design System当前仓库 carbon中 React 组件库packages/react的 Button 组件迁移文档完整讲解从 Carbon v9 升级到 v10 时Button组件 API 的三项核心变更icon到renderIcon的图标渲染机制重构、kinddanger--primary的移除以及inputRef到ref的引用方式统一。读完本文你将能够精准完成旧版本 Button 代码的迁移理解新图标组件的使用方式与无障碍要求并掌握当前版本源码中renderIcon的真实实现细节。迁移背景v9 与 v10 的 Props 差异总览原迁移文档 migrate-to-7.x.md 以一张简洁的对照表列出了Button组件在 v9 与 v10 之间的关键差异这是本次迁移的核心依据v9v10icon接受来自carbon-icons的图标名称或图标数据renderIcon接受一个 React 组件例如来自carbon/icons-react的图标组件kind中取值为danger--primary已移除RemovedinputRefref从表格可以看到v10 的迁移本质上围绕三件事展开图标传入方式从「数据/名称」变为「组件」、danger 按钮样式体系被重构、ref 的使用收敛到 React 标准 API。下面逐项展开。变更一icon→renderIcon从图标数据到 React 组件v9 时代的图标用法在 Carbon v9 中Button 的icon属性接收的是来自carbon-icons包当时独立的 SVG 图标集合包的图标名称字符串或图标数据对象。例如import { iconAdd } from carbon-icons; Button icon{iconAdd}Add/Button这种方式需要依赖一套独立的图标数据注册机制图标以数据对象的形式注入组件内部再由 Button 自行渲染为 SVG。v10 时代的renderIcon用法v10 将图标传入方式改为组件注入renderIcon接收一个 React 组件component最典型的是来自carbon/icons-react的图标组件。原文档给出了官方迁移示例import AddFilled16 from carbon/icons-react/lib/add--filled/16; ... Button renderIcon{AddFilled16} /该示例展示了两点关键信息图标来源包变更v10 推荐使用carbon/icons-react而非旧的carbon-icons。在 Button.mdx 与 Button.stories.js 中可以看到当前代码统一从carbon/icons-react导入图标如Add、TrashCan、Notification、Filter等。按需引入的路径风格示例中的carbon/icons-react/lib/add--filled/16是 v10 早期推荐的按需导入路径lib目录 图标名称 尺寸后缀16表示 16px 尺寸。当前仓库的图标源文件仍保留该命名约定例如源 SVG 位于 packages/icons/src/svg/32/add--filled.svg同一图标族在packages/icons/src/svg下按尺寸分目录组织。源码视角renderIcon如何被渲染深入当前源码可以印证renderIcon的实际渲染机制。在 Button.tsx 中组件将renderIcon解构为ButtonImageElement随后在 ButtonBase.tsx 中将其渲染为带样式的 SVGconst buttonImage !ButtonImageElement ? null : ( ButtonImageElement aria-label{iconDescription} className{${prefix}--btn__icon} aria-hiddentrue / );从这段实现可以推断renderIcon本质上是被当作一个 React 元素类型element type直接实例化渲染其 className 会被固定设置为cds--btn__iconprefix默认为cds保证图标在按钮内按设计规范对齐。同时图标本身被标记为aria-hiddentrue说明图标是装饰性的真正的可访问名称必须由iconDescription或按钮文本提供。无障碍要求iconDescription的配套使用在 Button.tsx 中源码对缺失iconDescription的情况做了显式校验if (ButtonImageElement !children !iconDescription) { console.error( Button: renderIcon property specified without also providing an iconDescription property. This may impact accessibility for screen reader users. ); }对应的 Button-test.js 中也有专门测试用例验证该行为it(should report a prop violation error if renderIcon is passed without iconDescription and children, () { const spy jest.spyOn(console, error).mockImplementation(() {}); render(Button renderIcon{Search} /); try { expect(spy).toHaveBeenCalled(); } finally { spy.mockRestore(); } });因此迁移时若按钮既无文本子元素又无iconDescription必须补充iconDescription同时它会被用作图标的aria-label见 ButtonBase.tsx否则会触发控制台警告并影响屏幕阅读器用户体验。最稳妥的迁移写法是import { Add } from carbon/icons-react; Button renderIcon{Add} iconDescriptionAdd Add /Button延伸hasIconOnly与图标按钮除renderIcon外当前源码还提供了hasIconOnly属性见 Button.tsx用于声明「纯图标按钮」形态。当hasIconOnly{true}时Button 会转而渲染为IconButton并支持tooltipPositiontop/right/bottom/left、tooltipAlignmentstart/center/end、tooltipHighContrast、tooltipDropShadow等 tooltip 相关属性见 Button.tsx。Button-test.js 中的测试用例验证了tooltipPosition与tooltipAlignment到IconButton的align属性的映射逻辑如topstart→top-start。变更二kinddanger--primary已被移除移除的含义v9 中通过kinddanger--primary表达的「红色实底危险主按钮」样式在 v10 中被移除。原文档将其列为 Removed即该取值不再有效。当前版本的 kind 取值体系从当前源码 Button.tsx 可以看到现在完整的ButtonKinds定义export const ButtonKinds [ primary, secondary, danger, ghost, danger--primary, danger--ghost, danger--tertiary, tertiary, ] as const;值得注意的是当前版本源码中danger--primary仍然作为一个合法 kind 保留用于兼容或内部映射但迁移文档明确指出它在 v10 时曾被移除其职责被danger作为默认的危险主按钮取代。Button-test.js 中的参数化测试用例显示kinddanger对应cds--btn--danger类而danger--primary对应cds--btn--danger--primary类说明两者在当前版本中仍可映射到具体样式类。从 Button.mdx 的文档描述看当前危险按钮体系包含三种强调级别Button kinddangerDanger/Button Button kinddanger--tertiaryDanger tertiary/Button Button kinddanger--ghostDanger ghost/Button文档同时说明破坏性操作若是工作流中的必需或主要步骤应使用 primary即danger样式若只是用户可选的多个动作之一则使用danger--tertiary或danger--ghost等低强调样式。迁移建议若原代码使用kinddanger--primary请改用kinddanger若需要区分强调层级可结合danger--tertiary、danger--ghost危险按钮还可配合dangerDescription属性提供辅助说明文本。在 ButtonBase.tsx 中当 kind 为danger、danger--tertiary、danger--ghost且提供了dangerDescription时会渲染一段cds--visually-hidden的辅助文本并通过aria-describedby关联到按钮上为屏幕阅读器补充危险操作的描述。变更三inputRef→refv9 中 Button 组件通过非标准的inputRef属性暴露底层 DOM 引用v10 起改为使用 React 标准的ref属性。这一变更使得 Button 与其他 React 组件在 ref 使用上保持一致无需再记忆组件特有的属性名。在 Button.tsx 中当前组件通过React.forwardRef实现 ref 转发并支持多态polymorphic元素类型as属性const Button: ButtonComponent React.forwardRef( T extends React.ElementType button( props: ButtonPropsT, ref: React.Refunknown ) { // ... } );结合 ButtonBase.tsx 可以看到ref 最终被应用到实际渲染的元素上——默认是button指定href且未禁用时是a指定as时是自定义元素。迁移时只需将inputRef{el ...}改写为ref{el ...}// v9 Button inputRef{buttonRef} / // v10 Button ref{buttonRef} /迁移检查清单完成 v9 → v10 迁移后建议对照以下清单逐项确认图标导入确认已从carbon-icons切换到carbon/icons-react并删除对旧图标数据/名称的引用图标渲染确认iconxxx已改写为renderIcon{IconComponent}且导入的图标是一个 React 组件而非名称字符串无障碍纯图标按钮无文本子元素必须提供iconDescription避免触发源码中的 console 警告依据 Button.tsx危险按钮将kinddanger--primary替换为kinddanger需要更低强调时使用danger--tertiary/danger--ghostref将inputRef全部改为标准ref回归验证运行 Button 组件的单元测试Button-test.js验证渲染类名、图标渲染、无障碍警告与 tooltip 映射等行为。参考资料迁移文档原文packages/react/src/components/Button/migrate-to-7.x.md组件源码Button.tsx、ButtonBase.tsx单元测试packages/react/src/components/Button/tests/Button-test.js组件文档与示例Button.mdx、Button.stories.js图标源文件示例packages/icons/src/svg/32/add--filled.svg【免费下载链接】carbonA design system built by IBM项目地址: https://gitcode.com/GitHub_Trending/carbo/carbon创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考