JGuang

日历

Calendar · Ant Design

交互预览
npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

日历

按照日历形式展示数据的容器。

何时使用

当数据是日期或按照日期划分时,例如日程、课表、价格日历等,农历等。目前支持年/月切换。

代码演示

  • 基本 · basic
  • 通知事项日历 · notice-calendar
  • 跨日期事件 · event-range
  • 卡片模式 · card
  • 选择功能 · select
  • 农历日历 · lunar
  • 周数 · week
  • 自定义头部 · customize-header
  • 自定义语义结构的样式和类 · style-class

API

通用属性参考:通用属性

注意:Calendar 部分 locale 是从 value 中读取,所以请先正确设置 dayjs 的 locale。

// 默认语言为 en-US,所以如果需要使用其他语言,推荐在入口文件全局设置 locale
// import dayjs from 'dayjs';
// import 'dayjs/locale/zh-cn';
// dayjs.locale('zh-cn');

<Calendar cellRender={cellRender} onPanelChange={onPanelChange} onSelect={onSelect} />
参数说明类型默认值版本全局配置
cellRender自定义单元格的内容function(current: dayjs, info: { prefixCls: string, originNode: React.ReactElement, today: dayjs, range?: 'start' | 'end', type: PanelMode, locale?: Locale, subType?: 'hour' | 'minute' | 'second' | 'meridiem' }) => React.ReactNode-5.4.0×
classNames用于自定义组件内部各语义化结构的 class,支持对象或函数Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string>-6.0.0
dateFullCellRender自定义渲染日期单元格,返回内容覆盖单元格,>= 5.4.0 请用 fullCellRenderfunction(date: Dayjs): ReactNode-< 5.4.0×
fullCellRender自定义单元格的内容function(current: dayjs, info: { prefixCls: string, originNode: React.ReactElement, today: dayjs, range?: 'start' | 'end', type: PanelMode, locale?: Locale, subType?: 'hour' | 'minute' | 'second' | 'meridiem' }) => React.ReactNode-5.4.0×
defaultValue默认展示的日期dayjs-×
disabledDate不可选择的日期,参数为当前 value,注意使用时不要直接修改(currentDate: Dayjs) => boolean-×
fullscreen是否全屏显示booleantrue×
showWeek是否显示周数列booleanfalse5.23.0×
styles用于自定义组件内部各语义化结构的行内 style,支持对象或函数Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties>-6.0.0
headerRender自定义头部内容function(object:{value: Dayjs, type: 'year' | 'month', onChange: f(), onTypeChange: f()})-×
locale国际化配置object(默认配置)×
mode初始模式month | yearmonth×
validRange设置可以显示的日期[dayjs, dayjs]-×
value展示日期dayjs-×
onChange日期变化回调function(date: Dayjs)-×
onPanelChange日期面板变化回调function(date: Dayjs, mode: string)-×
onSelect选择日期回调,包含来源信息function(date: Dayjs, info: { source: 'year' | 'month' | 'date' | 'customize' })-info: 5.6.0×

Semantic DOM

语义节点原生说明版本
root根元素,包含日历组件的背景色、边框、圆角等基础样式和整体布局结构6.0.0
header头部元素,包含年份选择器、月份选择器、模式切换器的布局和样式控制6.0.0
body主体元素,包含日历表格的内边距、布局控制等样式,用于容纳日历网格6.0.0
content内容元素,包含日历表格的宽度、高度等尺寸控制和表格样式6.0.0
item条目元素,包含日历单元格的背景色、边框、悬停态、选中态等交互样式6.0.0
itemContent条目内容元素,包含日历单元格内自定义内容区域的高度、溢出等样式控制6.4.0

语义说明来源: vendor/components/calendar/demo/_semantic.tsx

主题变量(Design Token)

类型、继承关系和原生令牌声明保持固定源码原文;默认值由原生主题计算,并可能受 ConfigProvider 覆盖。本表不伪造静态默认值。

令牌类型原生说明
yearControlWidthnumber | string年选择器宽度
monthControlWidthnumber | string月选择器宽度
miniContentHeightnumber | string迷你日历内容高度
fullBgstring完整日历背景色
fullPanelBgstring完整日历面板背景色
itemActiveBgstring日期项选中背景色

声明来源: vendor/components/calendar/style/index.ts

import type { CSSObject } from '@ant-design/cssinjs';

import { unit } from '@ant-design/cssinjs';

import type { PanelComponentToken, PickerPanelToken } from '../../date-picker/style';

import {
  genPanelStyle,
  initPanelComponentToken,
  initPickerPanelToken,
} from '../../date-picker/style';

import { resetComponent } from '../../style';

import type { FullToken, GenerateStyle, GetDefaultToken } from '../../theme/internal';

import { genStyleHooks, mergeToken } from '../../theme/internal';

export interface ComponentToken {
  /**
   * @desc 年选择器宽度
   * @descEN Width of year select
   */
  yearControlWidth: number | string;
  /**
   * @desc 月选择器宽度
   * @descEN Width of month select
   */
  monthControlWidth: number | string;
  /**
   * @desc 迷你日历内容高度
   * @descEN Height of mini calendar content
   */
  miniContentHeight: number | string;
  /**
   * @desc 完整日历背景色
   * @descEN Background color of full calendar
   */
  fullBg: string;
  /**
   * @desc 完整日历面板背景色
   * @descEN Background color of full calendar panel
   */
  fullPanelBg: string;
  /**
   * @desc 日期项选中背景色
   * @descEN Background color of selected date item
   */
  itemActiveBg: string;
}

interface CalendarToken extends FullToken<'Calendar'>, PickerPanelToken, PanelComponentToken {
  /**
   * @desc 日历类名
   * @descEN Calendar class name
   */
  calendarCls: string;
  /**
   * @desc 日期值高度
   * @descEN Date value height
   */
  dateValueHeight: number | string;
  /**
   * @desc 周高度
   * @descEN Week height
   */
  weekHeight: number | string;
  /**
   * @desc 日期内容高度
   * @descEN Date content height
   */
  dateContentHeight: number | string;
}

FAQ

如何在 Calendar 中使用自定义日期库

参考 使用自定义日期库。

如何给日期类组件配置国际化?

参考 如何给日期类组件配置国际化。

为什么时间类组件的国际化 locale 设置不生效?

参考 FAQ 为什么时间类组件的国际化 locale 设置不生效?。

如何仅获取来自面板点击的日期?

onSelect 事件提供额外的来源信息,你可以通过 info.source 来判断来源:

<Calendar
  onSelect={(date, { source }) => {
    if (source === 'date') {
      console.log('Panel Select:', source);
    }
  }}
/>

原生通用属性

Tips: 以下通用属性适用于 antd 大部分组件,不支持的组件会单独说明。

参数说明类型默认值
style自定义样式CSSProperties-
className自定义类名string-
rootClassName添加在组件最外层的 classNamestring-
autoFocus自动获取焦点,仅对表单类、链接、交互容器等可聚焦元素生效booleanfalse

安装并复现示例

npm install antd@6.6.5 @ant-design/icons@6.3.4 dayjs@1.11.23

使用 ConfigProvider 和原生 App,并单独配置 dayjs 语言。每个示例在查看代码中列出完整源码文件和额外固定依赖。示例名称用于选择演示,不是组件通用属性。主题、语言与 SSR 初始化见资源安装指南。

原生类型参考

源码查看器包含未修改的原生实现和以下声明文件,继承类型仍位于原生包中。代码中的英文注释保留为源码参考。

  • vendor/components/calendar/Header.tsx
  • vendor/components/calendar/generateCalendar.tsx
  • vendor/components/calendar/index.tsx
  • vendor/components/calendar/style/index.ts

来源与许可

https://github.com/ant-design/ant-design/tree/4a39f54842eade4e565ab336ef6097cd7e723cdd

保留原生中英文正文与可执行示例;官网专用的嵌入章节和令牌表格在本地展开。Ant Design 使用 MIT 许可,另列依赖的许可证也需保留。上传预览禁止向外发起请求,不提供后端服务。