Ant Design 5 组件 Token 实战:用 ConfigProvider 将 Button 定制为 MUI 风格
【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design
本篇指南以ant-design仓库中 Button 组件 Token 演示 为蓝本,讲解如何通过ConfigProvider的theme.components.Button覆盖组件级 Token,在不改动任何全局样式的前提下,将默认按钮体系重塑为 MUI(Material UI)风格的 TEXT / CONTAINED / OUTLINED 三种变体。读完本文,你将掌握组件 Token 的完整清单、默认值推导逻辑、algorithm派生机制,以及一套可直接复制运行的 MUI 风格按钮配置。
一、先看懂演示文档与配套 Demo
仓库中 component-token.md 是演示文件的说明,中英文各一句话:
组件 Token,模仿 MUI 风格的 Button / Component Token. Button with MUI style.
对应的完整实现位于 component-token.tsx,其核心是在ConfigProvider的theme.components.Button下覆盖一批 Token,然后渲染三组按钮(常规 / 禁用 / small 尺寸),分别使用type="text"、type="primary"与默认type,对应 MUI 的 TEXT、CONTAINED、OUTLINED 三种变体。这是理解组件 Token 最直观的入口。
二、什么是组件 Token:与全局 Token 的分工
在 Ant Design 5 的 CSS-in-JS 主题体系里,Token 分为两层:
- 全局 Token(Design Token):如
colorPrimary、borderRadius、controlHeight,由 Seed Token 经过算法派生,影响所有组件; - 组件 Token(Component Token):挂在
theme.components下、按组件名命名的 Token,只作用于对应组件,组件之间互不影响。
按 customize-theme 主题定制文档 的说明:默认情况下,组件 Token 只能覆盖全局 Token,不会基于 Seed Token 做派生计算;从>= 5.8.0起,组件 Token 支持algorithm属性,可设为true继承当前全局算法,或传入一个/多个算法对该组件单独生效。这正是 Demo 中algorithm: true这一行的意义——它让 Button 组件的其余 Token 继续沿用全局算法派生结果,保证覆盖少量 Token 后整体风格不自洽破裂。
三、Button 组件 Token 完整清单
在 components/button/style/token.ts 中定义了 Button 的ComponentToken接口,共 30 余个字段,按用途可分为五类:
| 类别 | Token 字段 | 说明 |
|---|---|---|
| 字重与字号 | fontWeight、contentFontSize/contentFontSizeSM/contentFontSizeLG、contentLineHeight系列 | 控制按钮文字的字重、字号与行高,按 base / small / large 三档分别提供 |
| 阴影 | defaultShadow、primaryShadow、dangerShadow | 默认、主要、危险三种按钮的阴影,默认值由controlOutlineWidth与对应 outline 色组合而成 |
| 文本与背景色 | defaultColor、defaultBg、primaryColor、dangerColor、defaultHoverBg/Color/BorderColor、defaultActiveBg/Color/BorderColor、defaultBorderColor、borderColorDisabled | 覆盖默认按钮在 normal / hover / active / disabled 各状态下的颜色,其中borderColorDisabled还兼容旧版写法defaultBorderColorDisabled |
| 幽灵按钮 | defaultGhostColor、ghostBg、defaultGhostBorderColor | 控制ghost属性的配色 |
| 尺寸与内边距 | paddingInline/paddingInlineSM/paddingInlineLG、paddingBlock系列、onlyIconSize/onlyIconSizeSM/onlyIconSizeLG | 分别控制三档尺寸的横向/纵向内边距与纯图标按钮的图标大小 |
| 特殊场景 | groupBorderColor、linkHoverBg、textHoverBg | 按钮组边框、type="link"与type="text"的悬浮背景 |
这些字段的默认值并不是硬编码常量,而是在 prepareComponentToken 中基于全局 Token 实时计算:例如defaultShadow: \0 ${token.controlOutlineWidth}px 0 ${token.controlTmpOutline}`,paddingBlock则由(controlHeight - contentFontSize × contentLineHeight) / 2 - lineWidth` 推导并做了不小于 0 的兜底。这意味着你只改一个全局 Token,Button 的派生样式会自动联动。
四、Demo 逐行拆解:MUI 风格配置参数详解
以下是 component-token.tsx 中components.Button的完整配置:
<ConfigProvider theme={{ components: { Button: { algorithm: true, colorPrimary: '#1976d2', controlHeight: 36, primaryShadow: '0 3px 1px -2px rgba(0,0,0,0.2), 0 2px 2px 0 rgba(0,0,0,0.14), 0 1px 5px 0 rgba(0,0,0,0.12)', fontWeight: 500, defaultBorderColor: 'rgba(25, 118, 210, 0.5)', colorText: '#1976d2', defaultColor: '#1976d2', borderRadius: 4, colorTextDisabled: 'rgba(0, 0, 0, 0.26)', colorBgContainerDisabled: 'rgba(0, 0, 0, 0.12)', contentFontSizeSM: 12, }, }, }} >各参数作用与取值来源说明:
algorithm: true:开启组件级算法派生(需 antd>= 5.8.0),让未显式覆盖的 Token 继续由全局算法推导;colorPrimary: '#1976d2':MUI 标志性的蓝色主色,同时驱动primary按钮背景与主色相关派生色(hover / active);controlHeight: 36:把按钮基准高度从默认 32px 提到 36px,贴近 MUI 按钮高度;三个尺寸档位(SM/base/LG)的 padding 都会随之重算;primaryShadow:一段三段式阴影,即 MUI elevation 风格的典型阴影写法,直接赋给primary按钮(见 genPrimaryButtonStyle 中boxShadow: token.primaryShadow);fontWeight: 500:MUI 按钮的 Medium 字重。注意fontWeight与contentLineHeight系列在样式注册时被标记为unitless(见 style/index.ts 的 unitless 配置),不会被追加px单位;defaultBorderColor: 'rgba(25, 118, 210, 0.5)':半透明主色边框,即 MUI OUTLINED 按钮的描边;colorText: '#1976d2'与defaultColor: '#1976d2':前者是全局 Token,把文字色改为品牌蓝;后者是组件 Token,指定默认按钮文字色,两者配合让 OUTLINED 按钮的文字呈现主色;borderRadius: 4:全局 Token,把圆角从 6px 收窄到 4px,更接近 MUI 的锐利造型;colorTextDisabled/colorBgContainerDisabled:禁用态文字与背景色,分别使用 MUI 常用的rgba(0,0,0,0.26)与rgba(0,0,0,0.12);contentFontSizeSM: 12:仅缩小 small 档字号,演示按尺寸档位细调组件 Token 的能力。
渲染端则用三种type建立映射:
<Button type="text">TEXT</Button> // MUI Text Button <Button type="primary">CONTAINED</Button> // MUI Contained Button <Button>OUTLINED</Button> // MUI Outlined Button三行分别叠加disabled与size="small"展示禁用态与小尺寸效果。
五、源码级原理:Token 如何变成 CSS
在 components/button/style/index.ts 中,Button 样式通过genStyleHooks('Button', ...)注册,内部把 Token 分派给五组生成函数:
genSharedButtonStyle:基础布局——inline-flex居中、fontWeight、边框、过渡动画与焦点样式;genSizeBaseButtonStyle/genSizeSmallButtonStyle/genSizeLargeButtonStyle:用mergeToken将contentFontSize*、contentLineHeight*、paddingInline*、paddingBlock*、onlyIconSize*合并进对应尺寸档位的 token,再生成height、padding、borderRadius与图标字号(genButtonStyle);genBlockButtonStyle:处理block全宽;genTypeButtonStyle:为 default / primary / dashed / link / text / ghost 六种类型分别套用genDefaultButtonStyle、genPrimaryButtonStyle等生成器,这些生成器直接读取token.defaultBg、token.primaryColor、token.primaryShadow等组件 Token 输出background、color、boxShadow,并通过genHoverActiveButtonStyle生成:hover/:active状态色;genGroupStyle:使用groupBorderColor处理 Button.Group 的边框衔接。
因此,你在theme.components.Button中写入的每个字段,最终都会被prepareToken/mergeToken汇入 Button 专属 token 池,再被上述生成器消费——这就是"改一个配置、整组状态样式联动"的底层机制。
六、延伸:三档尺寸与纯图标按钮的精细控制
如果你需要更细的定制,除 Demo 中展示的字段外,还可在 token.ts 中找到以下高频项:
- 尺寸档:
contentFontSizeLG、contentLineHeightLG、paddingInlineLG、paddingBlockLG控制 large;...SM系列控制 small; - 纯图标按钮:
onlyIconSize(默认fontSizeLG)、onlyIconSizeSM(fontSizeLG - 2)、onlyIconSizeLG(fontSizeLG + 2)控制仅含图标的按钮图标大小; - 状态覆盖:
defaultHoverBg/Color/BorderColor与defaultActiveBg/Color/BorderColor可分别定制 hover 与 active 态,默认值均从colorPrimaryHover/colorPrimaryActive派生(token.ts 默认值); - 幽灵按钮:
ghostBg(默认transparent)、defaultGhostColor、defaultGhostBorderColor控制透明背景下的文字与描边颜色。
完整的字段清单与说明还会自动渲染到 Button 文档的 Design Token 表格(由<ComponentTokenTable component="Button">生成),可作为日常查阅的速查表。
七、小结
通过本演示可以总结出组件 Token 的两条使用准则:
- 按组件隔离定制:把定制写在
theme.components.Button而非全局token,即可做到只影响 Button、不影响 Input 等其他组件; - 善用派生与算法:
algorithm: true让未覆盖项继续跟随全局算法,避免手写全部 Token;需要精细控制时再逐个覆盖defaultHover*、padding*、onlyIconSize*等派生字段。
Demo 展示的 MUI 风格只是组件 Token 能力的一个切片——同样的思路完全可以用于复刻 Bootstrap、Plain 或任何目标设计体系的按钮视觉,且无需改动任何组件源码,只需在 component-token.tsx 的基础上调整配置值即可。
【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考