Ant Design Steps 点状步骤条自定义展示实战指南
【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design
点状步骤条(Progress Dot Steps)是 Ant DesignSteps组件的一种紧凑形态,用圆点替代数字/图标来标示步骤进度。本文以官方 Demo「Customized Dot Style」(customized-progress-dot.md)为核心,系统讲解progressDot属性的用法:从最简单的开启方式,到通过渲染函数对每个圆点进行完全自定义(如结合Popover实现悬停提示),并深入源码剖析圆点的渲染机制与样式 Token,帮助你掌握点状步骤条从「开箱即用」到「深度定制」的完整链路。
一、Demo 速览:为点状步骤条增加自定义展示
官方 Demo 的定位非常明确:为点状步骤条增加自定义展示(You can customize the display for Steps with progress dot style)。它的核心手法只有一个——把progressDot从布尔值换成自定义渲染函数,并在函数内部用Popover包裹默认圆点,从而让每个圆点在悬停时展示当前步骤的下标和状态。
完整源码位于 customized-progress-dot.tsx,其本质结构如下:
import React from 'react'; import type { StepsProps } from 'antd'; import { Popover, Steps } from 'antd'; // 自定义圆点渲染函数:用 Popover 包裹默认 dot,悬停展示 index 与 status const customDot: StepsProps['progressDot'] = (dot, { status, index }) => ( <Popover content={ <span> step {index} status: {status} </span> } > {dot} </Popover> ); const description = 'You can hover on the dot.'; const App: React.FC = () => ( <Steps current={1} progressDot={customDot} items={[ { title: 'Finished', description }, { title: 'In Progress', description }, { title: 'Waiting', description }, { title: 'Waiting', description }, ]} /> ); export default App;运行后,四个步骤以圆点呈现,current={1}使第二个步骤处于进行中状态;当鼠标悬停在任意圆点上时,会弹出 Popover,内容为step {index} status: {status}。这个 Demo 虽然代码量不大,却完整展示了progressDot函数式自定义的核心思想:渲染函数接收默认圆点节点与上下文参数,你可以在不改动组件内部逻辑的前提下,任意替换、包装或增强每个圆点。
二、从布尔值到函数:progressDot 的两种用法
在 Ant Design 的Steps组件中,progressDot属性(定义见 StepsProps)接受两种形态:
| 取值 | 含义 | 示例 |
|---|---|---|
boolean(true) | 直接启用点状样式,圆点为组件内置的默认样式 | <Steps progressDot current={1} items={items} /> |
(iconDot, info) => ReactNode | 传入渲染函数,对每个圆点进行完全自定义 | <Steps progressDot={customDot} ... /> |
2.1 布尔值开启:一行代码切换点状形态
基础用法见 progress-dot.tsx:
<Steps progressDot current={1} items={[/* ... */]} />仅需设置progressDot(等价于progressDot={true}),步骤条即切换为点状样式,同时官方文档明确说明:开启后labelPlacement会被强制为vertical,即标题与描述在圆点下方垂直排布(该说明记录于 index.en-US.md 的 API 表格)。同一 Demo 还演示了direction="vertical"的纵向点状步骤条,圆点沿竖直方向排列,适合空间紧凑或需要纵向引导的流程场景。
2.2 函数式自定义:完整掌控每个圆点
当progressDot是函数时,签名如下(与 index.en-US.md 中 API 表格一致):
progressDot?: boolean | (iconDot, { index, status, title, description }) => ReactNodeiconDot:组件默认渲染的圆点节点(ReactNode),保留它即可继承内置圆点的尺寸、颜色与交互动效;info:一个上下文对象,包含四个字段:index:当前步骤的下标(从 0 开始),可用于「第几步」类提示;status:当前步骤状态,取值为wait|process|finish|error(状态枚举见 index.tsx 中StepProps的定义),对应「等待 / 进行中 / 已完成 / 出错」;title:步骤标题;description:步骤描述。
Demo 中正是读取了index与status来拼装提示文案:step {index} status: {status}。这四个参数意味着你完全可以根据步骤所处的阶段,为圆点渲染不同的内容——例如在error状态显示红色感叹号、在finish状态叠加对勾图标,或对特定index附加 badge。
三、实战扩展:结合 Popover 实现悬停信息提示
Demo 最具实战价值的部分,是它示范了「函数式 progressDot + Popover」的组合,这是点状步骤条最常见的增强需求:点状形态下空间有限,无法直接展示长文本,通过悬浮气泡可以按需呈现补充信息。
实现要点有三个:
- 保留
dot作为子节点:把iconDot原样放进Popover的 children,圆点的视觉与动效完全不受影响; - 用
content承载提示内容:content中组合index与status即可生成动态文案; - 让描述文本引导用户:Demo 将每个步骤的
description设为'You can hover on the dot.',提示用户「可悬停圆点查看信息」——在真实业务中,你也可以把描述设置为「点击查看详情」「悬停查看审批人」等引导语。
如果需要更进一步,还可以在Popover内继续嵌套Button、Tag、时间线等任意 Ant Design 组件,把圆点变成交互入口,而这一切都不需要触碰Steps组件源码。
四、相关形态对照:默认点状、小尺寸点状与自定义点状
仓库中与点状步骤条相关的 Demo 共有三个,适合对照阅读:
| Demo 文件 | 演示内容 | 与本文的关系 |
|---|---|---|
| progress-dot.tsx | 默认点状样式(横向 + 纵向) | 自定义的「默认形态」基线 |
| customized-progress-dot.tsx | 函数式自定义点状(Popover 包裹) | 本文核心 |
| progress-dot-small.tsx | 点状 +size="small"小尺寸 | 点状样式在紧凑场景的变体 |
其中progress-dot-small.tsx展示了点状步骤条与size="small"的组合,横向、纵向两种方向均可用。这些 Demo 均被仓库的渲染测试覆盖,例如快照 demo.test.ts.snap 中记录了customized-progress-dot.tsx的渲染结果,可作为实现正确性的验证依据。
五、源码级原理:圆点如何渲染与着色
5.1 组件层:progressDot 透传给底层 rc-steps
从源码结构看,Ant Design 的Steps是对rc-steps的封装(index.tsx)。StepsProps中声明progressDot?: boolean | ProgressDotRender(index.tsx),其中ProgressDotRender类型直接来自rc-steps的Steps模块。组件主体在 index.tsx 中通过展开restProps将progressDot等属性透传给RcSteps,同时注入默认图标(finish 的 CheckOutlined、error 的 CloseOutlined)和前缀prefixCls。可以推断,点状渲染的实际分支逻辑位于rc-steps内部:当progressDot为真值时,步骤图标由圆点节点替代;为函数时,则调用函数并以返回值作为图标节点。
5.2 样式层:dot 的尺寸与动效由设计 Token 驱动
圆点的视觉样式由独立的样式生成文件 progress-dot.ts 负责,该文件在 style/index.ts 中被引入。其中几个关键实现细节:
- 尺寸 Token:普通圆点大小为
dotSize = controlHeight / 4,进行中(process)圆点放大为dotCurrentSize = controlHeightLG / 4(见 style/index.ts),实现「当前步骤圆点更大」的视觉焦点; - 圆形与动效:圆点使用
border-radius: 100保证正圆,并设置transition: all motionDurationSlow使状态切换平滑过渡(progress-dot.ts); - 状态着色:样式通过
dotColorKey按状态取色,例如waitDotColor、processDotColor、finishDotColor、errorDotColor等 Token(style/index.ts),这解释了为什么不同状态的圆点颜色不同; - 悬停热区扩展:圆点还通过
::after伪元素扩大了可交互区域(progress-dot.ts),避免小圆点难以点击或悬停——这正是 Demo 中 Popover 能够舒适触发的底层保证; - 纵向布局适配:文件末尾单独处理了
vertical+dot组合下图标、连接线的位置计算(progress-dot.ts)。
理解了这些样式规则,你就能解释自定义场景中的各种现象:例如process圆点比其他圆点大、状态颜色自动随status变化、横向点状步骤条中标题描述强制垂直排布等。
六、API 速查与常见问题
6.1 相关 API 一览
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
progressDot | boolean \| (iconDot, {index, status, title, description}) => ReactNode | false | 点状样式开关与自定义入口,函数式开启时labelPlacement强制为vertical |
current | number | 0 | 当前步骤下标,从 0 计数 |
direction | 'horizontal' \| 'vertical' | 'horizontal' | 步骤条方向 |
size | 'default' \| 'small' | 'default' | 尺寸,点状形态同样适用 |
status | 'wait' \| 'process' \| 'finish' \| 'error' | 'process' | 整体状态(可在StepItem上覆盖) |
items | StepItem[] | [] | 步骤数据源,推荐使用(4.24.0+) |
更多属性说明可查阅 index.en-US.md 的完整 API 表格。
6.2 常见疑问
- 开启 progressDot 后标题跑到圆点下面了?这是设计使然:官方明确说明开启点状样式后
labelPlacement会被强制为vertical,用于保证窄布局下的可读性,并非 bug。 - 如何只改某个状态圆点的颜色?无需写 CSS,可通过主题 Token(如
processDotColor、finishDotColor等,定义见 style/index.ts)全局调整;若需单个步骤特殊处理,则适合用progressDot函数对特定status分支返回自定义节点。 - 自定义函数返回的节点必须包含
iconDot吗?不强制。返回任何 ReactNode 均可,完全脱离默认圆点自行绘制也是合法的,只是会失去内置的尺寸、配色与动效。
结语
从「一行布尔值开启点状样式」到「函数式自定义每个圆点」,progressDot是 Ant DesignSteps中兼顾易用性与扩展性的典型设计。本文所讲的自定义展示方案(customized-progress-dot.tsx)可直接复制进业务代码,将悬停提示、状态徽标、步骤跳转等能力挂载到原本只负责「展示进度」的圆点上,让点状步骤条从纯视觉元素升级为可交互的流程引导工具。
【免费下载链接】ant-designAn enterprise-class UI design language and React UI library项目地址: https://gitcode.com/gh_mirrors/ant/ant-design
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考