返回目录
组件详情入口
表单
@vean/ui
SDatePicker

DatePicker

DatePicker 属于 表单 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

日期选择器

概述

日期选择器组件:将可键盘编辑的分段式日期字段与日历弹层组合,既可直接在分段中键入日期,也可点击日历开关从月历网格中选择。适用于任何需要用户选择单个日期的场景——预订、日程、筛选,或需要范围校验的表单。只需要纯键入、无需弹层时,优先使用 SDateField;需要独立浏览日历网格时,使用 SCalendar。

用法

特性

  • 📅 字段 + 弹层组合——分段 DateField 保持可编辑,日历 Popover 提供可视化选择
  • 🎚 受控 / 非受控——值为 v-model/defaultValue,弹层为 open/defaultOpen,均由 useControllableState 支撑
  • ⌨️ 完整键盘编辑——字段内分段增减/键入,日历网格方向键导航,Escape 关闭
  • ⛓ 范围校验——minValue/maxValue/isDateUnavailable 在字段与日历中同时禁用越界与不可用日期
  • 🌍 本地化可访问性——日历开关与弹层对话框的默认 aria-label 来自当前 locale 消息,并可通过 triggerProps/popupProps 覆盖
  • 🧩 可组合插槽——leading 放置分段前内容;default 插槽 props 暴露 open/close/calendarProps,支持完全自定义弹层
  • 🎨 细粒度样式——ui 覆盖字段及 trigger/positioner/popup 槽,calendarUi 独立作用于内嵌日历
  • 🚫 禁用状态——disabled 同时阻止字段编辑与弹层打开

组件族系

  • SDatePicker——样式包装层:透传 props 给 Aria compact,注入 datePickerVariants(扩展 dateFieldVariants),并在弹层内渲染 SCalendar
  • DatePickerCompact(Aria)——由 DateFieldCompact + PopoverCompact(日历图标触发器)数据驱动组合,通过 default 插槽暴露弹层状态与 calendarProps;无样式使用时从 @vean/aria/date-picker 导入
  • DateFieldCompact / PopoverCompact / CalendarCompact(Aria)——支撑选择器的分段字段、Popover 机制与日历网格

演示

基础

年月日

自定义样式

年月日

API

Aria 层

2

DatePicker

53 属性10 事件1 插槽
属性
属性名类型默认值描述
class
ClassValue
—
应用于根元素的额外类名。
size
ThemeSize
—
组件的视觉尺寸。
ui
Partial<DatePickerUi>
—
该组件的按槽类重写。
calendarUi
Partial<CalendarUi>
—
DatePicker 中的 Calendar 组件针对每个插槽的类重写。
dateFieldProps
BaseProps
—
—
placement
import("@/index").Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopoverTriggerProps
—
转发给触发元素的属性。
portalProps
PopperPortalProps
—
转发给 portal 元素的属性。
positionerProps
PopoverPositionerProps
—
转发给定位器元素的属性。
popupProps
PopoverPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
PopperArrowProps
—
转发给箭头元素的属性。
closeProps
PopoverCloseProps
—
转发至 close 元素的属性。
dir
Direction
—
组件的阅读方向。
open
boolean
—
—
defaultOpen
boolean
—
—
modal
boolean
—
—
disabled
boolean
—
该组件是否已禁用。
headerProps
CalendarHeaderProps
—
转发至 header 元素的属性。
headingProps
CalendarHeadingProps
—
传递给 heading 元素的属性。
prevProps
CalendarPrevProps
—
转发给前一个元素的属性。
nextProps
CalendarNextProps
—
属性将转发给下一个元素。
gridProps
CalendarGridProps
—
转发给网格元素的属性。
gridHeadProps
CalendarGridHeadProps
—
转发给网格头元素的属性。
gridBodyProps
CalendarGridBodyProps
—
转发至 grid 主体元素的属性。
gridRowProps
CalendarGridRowProps
—
转发给网格行元素的属性。
headCellProps
CalendarHeadCellProps
—
转发至 head 单元格元素的属性。
cellProps
CalendarCellProps
—
转发给 cell 元素的属性。
cellTriggerProps
CalendarCellTriggerProps
—
转发给单元格触发器的属性。
locale
string
—
语言环境。
modelValue
DateValue
—
当前模型值。
defaultValue
DateValue
—
默认值。
multiple
false
—
是否支持多个值。
placeholder
DateValue
—
占位符。
defaultPlaceholder
DateValue
—
默认占位符。
readonly
boolean
—
该组件是否为只读。
pagedNavigation
boolean
—
是否启用分页导航。
preventDeselect
boolean
—
是否禁止取消选择。
weekStartsOn
WeekStartsOn
—
本周从...开始。
weekdayFormat
WeekDayFormat
—
星期格式。
calendarLabel
string
—
日历标签。
fixedWeeks
boolean
—
是否为固定周数。
maxValue
DateValue
—
最大值。
minValue
DateValue
—
最小值。
numberOfMonths
number
—
月数。
initialFocus
boolean
—
是否为初始焦点。
isDateDisabled
DateMatcher
—
日期是否已禁用。
isDateUnavailable
DateMatcher
—
日期是否不可用。
nextPage
((placeholder: DateValue) => DateValue)
—
下一页。
prevPage
((placeholder: DateValue) => DateValue)
—
上一页。
disableDaysOutsideCurrentView
boolean
—
是否禁用当前视图范围外的日期。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。
事件
事件名参数描述
update:open
boolean
当对话框的打开状态发生变化时调用的事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
update:modelValue
DateValue | undefined
当模型值发生变化时触发。
update:placeholder
DateValue
当占位符值发生变化时触发。
插槽
插槽名参数描述
leading
—
日期段之前渲染的自定义内容。

DatePickerCompact

49 属性10 事件2 插槽
属性
属性名类型默认值描述
dateFieldProps
BaseProps
—
—
placement
import("@/index").Placement
—
位置。
showArrow
boolean
—
是否显示箭头。
triggerProps
PopoverTriggerProps
—
转发给触发元素的属性。
portalProps
PopperPortalProps
—
转发给 portal 元素的属性。
positionerProps
PopoverPositionerProps
—
转发给定位器元素的属性。
popupProps
PopoverPopupProps
—
转发给弹出窗口元素的属性。
arrowProps
PopperArrowProps
—
转发给箭头元素的属性。
closeProps
PopoverCloseProps
—
转发至 close 元素的属性。
dir
Direction
—
组件的阅读方向。
open
boolean
—
—
defaultOpen
boolean
—
—
modal
boolean
—
—
disabled
boolean
—
该组件是否已禁用。
headerProps
CalendarHeaderProps
—
转发至 header 元素的属性。
headingProps
CalendarHeadingProps
—
传递给 heading 元素的属性。
prevProps
CalendarPrevProps
—
转发给前一个元素的属性。
nextProps
CalendarNextProps
—
属性将转发给下一个元素。
gridProps
CalendarGridProps
—
转发给网格元素的属性。
gridHeadProps
CalendarGridHeadProps
—
转发给网格头元素的属性。
gridBodyProps
CalendarGridBodyProps
—
转发至 grid 主体元素的属性。
gridRowProps
CalendarGridRowProps
—
转发给网格行元素的属性。
headCellProps
CalendarHeadCellProps
—
转发至 head 单元格元素的属性。
cellProps
CalendarCellProps
—
转发给 cell 元素的属性。
cellTriggerProps
CalendarCellTriggerProps
—
转发给单元格触发器的属性。
locale
string
—
语言环境。
modelValue
DateValue
—
当前模型值。
defaultValue
DateValue
—
默认值。
multiple
false
—
是否支持多个值。
placeholder
DateValue
—
占位符。
defaultPlaceholder
DateValue
—
默认占位符。
readonly
boolean
—
该组件是否为只读。
pagedNavigation
boolean
—
是否启用分页导航。
preventDeselect
boolean
—
是否禁止取消选择。
weekStartsOn
WeekStartsOn
—
本周从...开始。
weekdayFormat
WeekDayFormat
—
星期格式。
calendarLabel
string
—
日历标签。
fixedWeeks
boolean
—
是否为固定周数。
maxValue
DateValue
—
最大值。
minValue
DateValue
—
最小值。
numberOfMonths
number
—
月数。
initialFocus
boolean
—
是否为初始焦点。
isDateDisabled
DateMatcher
—
日期是否已禁用。
isDateUnavailable
DateMatcher
—
日期是否不可用。
nextPage
((placeholder: DateValue) => DateValue)
—
下一页。
prevPage
((placeholder: DateValue) => DateValue)
—
上一页。
disableDaysOutsideCurrentView
boolean
—
是否禁用当前视图范围外的日期。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。
事件
事件名参数描述
update:open
boolean
当对话框的打开状态发生变化时调用的事件处理程序。
escapeKeyDown
KeyboardEvent
当 Esc 键被按下时触发的事件处理程序。可被阻止。
pointerDownOutside
PointerDownOutsideEvent
当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。
focusOutside
FocusOutsideEvent
当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。
interactOutside
PointerDownOutsideEvent | FocusOutsideEvent
当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown` 事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。
openAutoFocus
Event
在打开页面时自动聚焦时触发的事件处理程序。可被阻止。
closeAutoFocus
Event
在关闭时自动聚焦时触发的事件处理程序。可被阻止。
placed
—
—
update:modelValue
DateValue | undefined
当模型值发生变化时触发。
update:placeholder
DateValue
当占位符值发生变化时触发。
插槽
插槽名参数描述
leading
—
日期段之前渲染的自定义内容。
default
DatePickerCompactSlotProps
日历弹出窗口的自定义内容,接收展开/折叠控件和日历属性。

注意

架构与行业对标差异

SDatePicker 将 props 透传给 DatePickerCompact,后者组合 DateFieldCompact(分段 + 校验)与 PopoverCompact(lucide:calendar 图标触发器,带 aria-haspopup="dialog")。样式层通过 provideDatePickerUi 注入 datePickerVariants 类,使嵌套的 Popover 部分获得 trigger/positioner/popup 样式,再在 default 插槽中用透传的 calendarProps 渲染 SCalendar。选中某天后触发 update:modelValue 并关闭弹层。弹层为 role="dialog",默认可访问名称来自 locale popupLabel 消息;开关按钮的默认名称来自 toggle。多数对标库是「纯文本框 + 选择面板」形态;「分段字段 + Popover 组合」与 Aria/styled 分离是差异点。

能力VeanUIAnt DesignElement PlusMantineNaive UIshadcn
Aria/styled 分离✅—————
分段字段 + 日历弹层✅—————
值受控 / 非受控✅✅✅✅✅—
弹层受控 / 非受控✅—————
键盘分段编辑✅—————
日历键盘导航✅✅✅✅✅✅
范围校验✅✅✅✅✅—
isDateUnavailable✅—————
禁用状态✅✅✅✅✅—
locale 驱动的可访问名称✅—————
leading 插槽✅—————
独立的 calendarUi✅—————

使用注意

  • 值是 DateValue(Date 或 { date, time? }),不是 string——请与 SDateField、SCalendar 及日期族系其他组件搭配使用。
  • defaultValue/defaultOpen 仅在挂载时读取——外部控制请使用 v-model/open。
  • 开关按钮就是日历图标;其默认 aria-label(locale toggle)可通过 triggerProps['aria-label'] 覆盖。图标本身固定——需要自定义触发器时,请用 @vean/aria/date-picker 组合 DatePickerCompact 并自行渲染 Popover 内容。
  • 弹层 role="dialog" 的可访问名称来自 locale popupLabel 消息;可通过 popupProps['aria-label'] 覆盖。
  • 通过 dateFieldProps(如 placeholder、locale、granularity)配置内嵌分段字段;字段与日历共享 minValue/maxValue/isDateUnavailable。
  • calendarUi 被内嵌日历消费、不会到达 DOM——dateFieldProps 同理。

常见问题

如何用键盘选择日期?

Tab 进入分段字段并键入数字或用方向键,或按下日历开关后用方向键、Home/End、PageUp/PageDown 在月历网格中导航;Enter 选中并关闭,Escape 关闭且不选中。

如何限制可选范围?

传入 minValue/maxValue——越界日期在日历中被禁用,字段也会标记自身 data-invalid。isDateUnavailable 接受谓词函数做任意排除,且同时作用于字段与日历。

如何配置内嵌日期字段?

使用 dateFieldProps——例如 { placeholder }、{ locale }、{ granularity: 'minute' } 或 { hourCycle: 12 }。字段接受的 props 与 SDateField 本身一致。

如何自定义日历外观?

calendarUi 独立于 ui 覆盖日历各槽位类。需要更深层定制时,default 插槽会收到 calendarProps(外加 open/close),可以用 @vean/aria/calendar 的 CalendarCompact 渲染自己的弹层内容。

SDatePicker 与 SDateField 有什么区别?

SDateField 是纯分段输入、无弹层——适合快速键入与表单提交。SDatePicker 在相同字段之上叠加日历 Popover,以少量体积换取可视化选择能力。

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.17.0

2026-05-03

对比版本

修复

为 PopoverRoot 添加禁用道具并更新测试选择器

范围: date-picker作者: soybeanjs, Copilot查看提交1cce9

优化

重构日期选择器组件并集成弹出窗口功能

范围: date-picker作者: soybeanjs, Copilot查看提交7ae41