跳到主要内容

DatePicker 日期选择DatePicker · DateRangePicker

在表单里选一个日期或一段日期,平时只占一行。DatePicker 可以直接打字,也可以点开日历;DateRangePicker 是一个按钮,点开后在日历上点两次。日期离今天很远(比如生日)时,打字比翻日历快。

基本用法

点输入框或右侧按钮都会打开日历。可以直接输入 2026-10-13、2026/10/13 或 2026.10.13,失焦或按 Enter 时生效;输入不合法或不可选的日期会退回原值。边打字日历边翻:只要已经能确定一个月份(比如打到 2026-11),日历就翻到那个月;打出完整、可选的日期时,日历里直接选中它,回车或失焦后才算选定。从日历里点选后自动收起。

格式:年-月-日

限制、格式与尺寸

min / max / isDateDisabled 同时约束日历和手动输入。format / parse 成对自定义显示和解析。

状态

受控用法

onChange 的参数是 Date,清空输入框时是 null。

value:2026-10-20

日期范围

DateRangePicker 是一个显示起止日期的按钮。第一次点定起点,第二次点定终点后自动收起。它不支持直接打字。

受控

还没有选择

非受控与自定义文案

表单提交

DatePicker 的 name、DateRangePicker 的 startName / endName 都通过隐藏 input 以 yyyy-MM-dd 提交,和显示格式无关。

API

DatePicker

属性类型默认值说明
valueDate | null—选中的日期(受控)。
defaultValueDate | nullnull初始日期(非受控)。
onChange(date: Date | null) => void—日期变化时触发;清空时为 null。
format(date: Date) => stringformatISODate日期 → 输入框里显示的文字。
parse(text: string) => Date | nullparseISODate输入的文字 → 日期;不合法返回 null。
min / maxDate—可选的最早 / 最晚日期(含)。
isDateDisabled(date: Date) => boolean—返回 true 的日期不可选。
weekStartsOn / locale / today——传给里面的日历,见 Calendar。
size'sm' | 'md' | 'lg''md'尺寸。
invalidboolean—标成校验未通过。
placeholderstring'年-月-日'占位文字。
name / formstring—隐藏 input 的字段名,以 yyyy-MM-dd 提交。
open / defaultOpen / onOpenChangeboolean / boolean / (open) => void—日历浮层的开关状态。
placementPlacement'bottom-start'日历相对输入框的位置。
…restInputHTMLAttributes—ref、className、style 落在外框上,其余原生属性(id、disabled、readOnly、aria-*)落在 <input> 上。

DateRangePicker

属性类型默认值说明
value{ start: Date | null; end: Date | null }—选中的范围(受控)。
defaultValueDateRange{ start: null, end: null }初始范围(非受控)。
onChange(range: DateRange) => void—每次点选都触发。
placeholderReactNode'开始日期 – 结束日期'没选时显示的文字。
separatorstring' – '起止之间的连接符。
startName / endNamestring—起 / 止两个隐藏 input 的字段名。
format / min / max / isDateDisabled / size / invalid / open… / placement——同 DatePicker。
…restButtonHTMLAttributes—ref 和其余原生属性落在触发按钮上。

无障碍

  • DatePicker 是一个普通文本框加一个名为“打开日历”的按钮;日历浮层是 role="dialog",名称“选择日期”。不想用日历的用户可以全程打字。
  • 在输入框里:Enter 或失焦提交输入的文字;Alt+↓ 打开日历。Tab 到按钮后 Enter / Space 也能打开。
  • 点按钮或按 Alt + ↓ 打开时,焦点落在日历的当前日期上,键盘操作同 Calendar;选中后收起,焦点回到按钮。Esc 不选直接收起。
  • 点输入框打开时焦点留在输入框里,可以接着打字;按 ↓ 进入日历,选中后焦点回到输入框;Esc 只收起日历;焦点离开输入框和日历时自动收起。
  • DateRangePicker 的触发按钮带 aria-haspopup="dialog" 和 aria-expanded,按钮上的文字就是当前范围。注意:给按钮 aria-label 或用 label 关联后,读屏只读这个名称、不再读按钮上的日期,所以请把已选范围另外写在页面上(像上面的示例那样),或用 aria-describedby 指过去。
  • 输入格式请写在提示文字里(如“格式:年-月-日”),不要只靠占位符——开始打字后占位符就看不到了。