antd Calendar 的 showWeek 详解:在日历中显示周数的实现与原理
本文聚焦 antd Calendar 组件的 showWeek 属性,讲解如何通过一个开关在全屏日历与迷你日历中显示 ISO 周数列,并结合 calendar 演示、生成器源码 与 样式实现 说明周数从属性传入到像素渲染的完整链路,读完后你能理解该特性的版本要求、默认行为以及在 fullscreen / mode 等不同形态下的表现。
一、demo 的核心结论:一行 showWeek 打开周数列
该示例的描述文档 week.md 原文只有两句话(中英文各一句),核心内容如下:
通过将
showWeek属性设置为true,在全屏日历中显示周数。 Show week number in fullscreen calendar by settingshowWeekprop totrue.
对应的可运行示例代码 week.tsx 完整地给出了两种形态的用法:
import React from 'react';
import { Calendar } from 'antd';
const App: React.FC = () => (
<>
<Calendar fullscreen showWeek />
<br />
<Calendar fullscreen={false} showWeek />
</>
);
export default App;
从示例代码可以确认两个要点:
showWeek是Calendar的一个可选布尔属性,只需传入布尔字面量true即可,没有周数起始日、周数格式等附加配置项;- 该属性对
fullscreen(全屏)与fullscreen={false}(迷你)两种形态都生效,但视觉呈现依赖形态对应的样式规则(下文第四节展开)。
二、showWeek 在 API 中的定义与版本前提
Calendar API 文档 中对该属性的完整定义为:
| 属性名 | 说明 | 类型 | 默认值 | 版本 | 支持键盘 |
|---|---|---|---|---|---|
showWeek |
是否显示周数列 | boolean |
false |
5.23.0 | × |
即该特性自 5.23.0 起提供,当前仓库 package.json 中版本为 6.6.2,默认不显示周数,不启用时无任何附加开销。
在类型层面,showWeek 被声明在通用的 CalendarProps 接口中(generateCalendar.tsx 第 82 行):
export interface CalendarProps<DateType> {
// ...
fullscreen?: boolean;
showWeek?: boolean;
// ...
}
由于 Calendar 组件是由 generateCalendar<Dayjs>(dayjsGenerateConfig) 生成的(见 index.tsx),这个接口同时服务于默认导出与 Calendar.generateCalendar 高阶用法,因此任何自定义 generateConfig 的日历都同样支持 showWeek。
三、源码链路:属性如何一路传到底层面板
在 generateCalendar.tsx 中,showWeek 的处理链路非常直接:
- 解构接收:第 130 行从
props中解构出showWeek; - 参与语义合并:第 147–152 行将其并入
mergedProps,与mode、fullscreen一起作为classNames/styles函数式回调的info.props输入,意味着自定义语义化样式可以感知当前是否开启了周数列; - 透传到底层面板:第 413–429 行,
showWeek被直接透传给@rc-component/picker提供的RCPickerPanel:
<RCPickerPanel
value={mergedValue}
prefixCls={prefixCls}
locale={locale?.lang}
generateConfig={generateConfig}
cellRender={mergedCellRender}
onSelect={(nextDate) => {
onInternalSelect(nextDate, panelMode);
}}
mode={panelMode}
picker={panelMode}
disabledDate={mergedDisabledDate}
hideHeader
showWeek={showWeek} // 关键:透传给面板
/>
从源码结构看,周数格的实际计算与渲染(按 ISO 周数规则生成每行第一列的周号)由底层 @rc-component/picker 的 PickerPanel 完成(当前仓库依赖版本为 ~1.12.2,见 package.json),Calendar 本身只负责透传开关并套用外层样式。这也解释了为什么 showWeek 同时出现在 Calendar 与 DatePicker 面板相关的类型体系中——它们共享同一套面板组件。
四、样式层:周数列在全屏与迷你形态下的呈现
showWeek 打开后,面板每行多出的周数格使用 -cell-week 类名。其样式规则位于 style/index.ts:
- 全屏形态(
${calendarCls}${calendarCls}-full选择器内,第 152–163 行):
[`${componentCls}-cell-week ${componentCls}-cell-inner`]: {
display: 'block',
borderRadius: 0,
borderTop: `${unit(token.lineWidthBold)} ${token.lineType} ${token.colorSplit}`,
width: '100%',
height: token
.calc(token.dateValueHeight)
.add(token.dateContentHeight)
.add(token.calc(token.paddingXS).div(2))
.add(token.lineWidthBold)
.equal(),
},
可以看到全屏日历的周数格高度是按「日期值高度 + 日期内容高度 + 半份 paddingXS + 加粗分隔线」动态计算的,保证周数格与同行日期格严格等高,顶部的粗分隔线(lineWidthBold)则用于视觉区分周数列与日期主体。
- 迷你形态(
-mini选择器内,第 112–132 行):周数格沿用面板通用 cell 布局,表头高度由weekHeighttoken 控制(lineHeight: unit(token.weekHeight),第 126 行)。weekHeight的默认值来自第 264 行的主题计算:calc(token.controlHeightSM).mul(0.75),即小型控件高度的 75%。
这与文档描述的「在全屏日历中显示周数」一致:全屏形态下周数列有专门的高度对齐与分隔线样式,是视觉上最完整、最典型的呈现场景。
五、实战要点与可验证的检查清单
结合 demo 目录 中的其他示例(basic、select、lunar 等),使用 showWeek 时建议注意以下几点:
- 与
mode配合:Calendar的mode支持'month'/'year'(见 generateCalendar.tsx 的CalendarMode类型),面板渲染时会被映射为'date'/'month'两种panelMode。开启周数后,日期面板(mode="month")每行首列即显示周数;如需固定展示某形态,可显式传入mode; - 与
disabledDate/validRange组合:周数格只承载编号信息,不可点击选中,不影响禁用规则。禁用逻辑统一由mergedDisabledDate合并validRange区间判断与自定义disabledDate后传入面板(generateCalendar.tsx),可与 event-range 示例 中的事件标注思路结合; - 自定义单元格时注意:若实现了
fullCellRender,它会接管整个格子(含周数行的视觉区域),此时周数格的展示效果取决于你自己的实现;cellRender只影响日期格内容区; - 版本前提:
showWeek自 5.23.0 起可用(API 文档),低于该版本的项目升级前请确认日期库与 rc-picker 版本满足要求。
六、小结
showWeek 是 antd Calendar 中一个低门槛、高实用性的开关属性:在业务上它让日历按 ISO 周对齐排期,在实现上它仅是一条「属性解构 → 语义合并 → 透传 RCPickerPanel」的短链路,而周数格的高度对齐与分隔线则由 components/calendar/style/index.ts 中的 token 化样式保证。围绕 week 演示 与 生成器源码,你可以快速验证:默认关闭、显式开启后全屏与迷你两种形态均生效、且与 mode、disabledDate 等既有能力互不冲突。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00