日期范围选择器
功能
- 完整的键盘导航
- 可受控或非受控
- 焦点完全受控
- 本地化支持
- 默认可访问
- 支持日期和日期时间格式
前言
该组件依赖于 @internationalized/date 包,它解决了在 JavaScript 中处理日期和时间所带来的许多问题。
我们强烈建议您阅读该包的文档,以便充分了解其工作原理,并且您需要将其安装到您的项目中才能使用日期相关组件。
安装
安装日期包。
$ npm add @internationalized/date
从命令行安装此组件。
$ npm add reka-ui
结构
导入所有部分并将其组合。
<script setup>
import {
DateRangePickerAnchor,
DateRangePickerArrow,
DateRangePickerCalendar,
DateRangePickerCell,
DateRangePickerCellTrigger,
DateRangePickerClose,
DateRangePickerContent,
DateRangePickerField,
DateRangePickerGrid,
DateRangePickerGridBody,
DateRangePickerGridHead,
DateRangePickerGridRow,
DateRangePickerHeadCell,
DateRangePickerHeader,
DateRangePickerHeading,
DateRangePickerInput,
DateRangePickerNext,
DateRangePickerPrev,
DateRangePickerRoot,
DateRangePickerTrigger,
} from 'reka-ui'
</script>
<template>
<DateRangePickerRoot>
<DateRangePickerField>
<DateRangePickerInput />
<DateRangePickerTrigger />
</DateRangePickerField>
<DateRangePickerAnchor />
<DateRangePickerContent>
<DateRangePickerClose />
<DateRangePickerArrow />
<DateRangePickerCalendar>
<DateRangePickerHeader>
<DateRangePickerPrev />
<DateRangePickerHeading />
<DateRangePickerNext />
</DateRangePickerHeader>
<DateRangePickerGrid>
<DateRangePickerGridHead>
<DateRangePickerGridRow>
<DateRangePickerHeadCell />
</DateRangePickerGridRow>
</DateRangePickerGridHead>
<DateRangePickerGridBody>
<DateRangePickerGridRow>
<DateRangePickerCell>
<DateRangePickerCellTrigger />
</DateRangePickerCell>
</DateRangePickerGridRow>
</DateRangePickerGridBody>
</DateRangePickerGrid>
</DateRangePickerCalendar>
</DateRangePickerContent>
</DateRangePickerRoot>
</template>
API 参考
根
包含日期选择器的所有部分
属性 | 默认 | 类型 |
---|---|---|
allowNonContiguousRanges | false | 布尔值 当与 |
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
defaultOpen | false | 布尔值 浮动窗口初始渲染时的打开状态。当您不需要控制其打开状态时使用。 |
defaultPlaceholder | DateValue 默认占位符日期 | |
defaultValue | { start: undefined, end: undefined } | DateRange 日历的默认值 |
dir | 'ltr' | 'rtl' 日期字段适用的阅读方向。 | |
disabled | false | 布尔值 日期字段是否被禁用 |
fixedDate | 'start' | 'end' 范围的哪一部分应该被固定 | |
fixedWeeks | false | 布尔值 日历是否始终显示6周 |
granularity | 'day' | 'hour' | 'minute' | 'second' 用于格式化时间的粒度。如果提供了 CalendarDate,则默认为“天”,否则默认为“分钟”。字段将呈现日期中每个部分的片段,直到并包括指定的粒度 | |
hideTimeZone | 布尔值 是否隐藏字段的时区部分 | |
hourCycle | 12 | 24 用于格式化时间的小时制。默认为本地偏好设置 | |
id | string 元素的 ID | |
isDateDisabled | Matcher 一个函数,返回日期是否被禁用 | |
isDateHighlightable | Matcher 一个函数,用于返回日期是否可高亮 | |
isDateUnavailable | Matcher 一个函数,返回日期是否不可用 | |
locale | 'en' | string 用于日期格式化的区域设置 |
maximumDays | 数字 在一个范围内可选择的最大天数 | |
maxValue | DateValue 可选择的最大日期 | |
minValue | DateValue 可选择的最小日期 | |
modal | false | 布尔值 浮动窗口的模态性。设置为 true 时,与外部元素的交互将被禁用,并且只有浮动窗口内容对屏幕阅读器可见。 |
modelValue | DateRange | null 日历的受控选中状态。可以绑定为 | |
name | string 字段的名称。随其所属的表单一起作为名称/值对提交。 | |
numberOfMonths | 1 | 数字 一次性显示的月份数量 |
open | 布尔值 浮动窗口的受控打开状态。 | |
pagedNavigation | false | 布尔值 此属性使上一页和下一页按钮以一次显示的月份数量进行导航,而非按月导航 |
placeholder | DateValue 占位符日期,用于在未选择日期时确定要显示的月份。此值会随着用户导航日历而更新,可用于编程方式控制日历视图。 | |
preventDeselect | false | 布尔值 是否阻止用户在未选择其他日期的情况下取消选择日期 |
readonly | false | 布尔值 日期字段是否只读 |
required | 布尔值 当为 | |
step | DateStep 时间字段的步进间隔。默认为 | |
weekdayFormat | 'narrow' | 'narrow' | 'short' | 'long' 通过 `weekdays` 插槽属性提供的星期字符串的格式 |
weekStartsOn | 0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 日历开始的星期几 |
事件触发 | 载荷 |
---|---|
update:modelValue | [date: DateRange] 每当模型值改变时调用的事件处理程序 |
update:open | [value: boolean] 子菜单打开状态改变时调用的事件处理程序。 |
update:placeholder | [date: DateValue] 每当占位符值改变时调用的事件处理程序 |
update:startValue | [date: DateValue] 当起始值发生变化时调用的事件处理程序 |
插槽(默认) | 载荷 |
---|---|
modelValue | DateRange |
open | 布尔值 |
方法 | 类型 |
---|---|
isDateDisabled | Matcher 一个函数,返回日期是否被禁用 |
isDateUnavailable | Matcher 一个函数,返回日期是否不可用 |
isDateHighlightable | Matcher 一个函数,用于返回日期是否可高亮 |
字段
包含日期选择器的日期字段分段和触发器
插槽(默认) | 载荷 |
---|---|
segments | { start: { part: SegmentPart; value: string; }[]; end: { part: SegmentPart; value: string; }[]; } |
modelValue | DateRange | null |
数据属性 | 值 |
---|---|
[data-readonly] | 只读时存在 |
[data-disabled] | 禁用时存在 |
[data-invalid] | 无效时存在 |
输入
包含日期选择器的日期字段分段
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
part* | 'day' | 'month' | 'year' | 'hour' | 'minute' | 'second' | 'dayPeriod' | 'literal' | 'timeZoneName' 要渲染的日期部分 | |
type* | 'start' | 'end' 要渲染的字段类型(开始或结束) |
数据属性 | 值 |
---|---|
[data-disabled] | 禁用时存在 |
[data-invalid] | 无效时存在 |
[data-placeholder] | 未设置值时存在 |
触发器
用于切换弹出框的按钮。默认情况下,DateRangePickerContent
将根据触发器自身定位。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
内容
浮动窗口打开时弹出的组件。
属性 | 默认 | 类型 |
---|---|---|
align | 'start' | 'center' | 'end' 相对于触发器的首选对齐方式。当发生碰撞时可能会改变。 | |
alignOffset | 数字 与 | |
arrowPadding | 数字 箭头与内容边缘之间的内边距。如果您的内容有 border-radius,这将防止它溢出角落。 | |
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
avoidCollisions | 布尔值 当为 | |
collisionBoundary | Element | (Element | null)[] | null 用作碰撞边界的元素。默认情况下是视口,但您可以提供其他元素以包含在此检查中。 | |
collisionPadding | 数字 | Partial<Record<'top' | 'right' | 'bottom' | 'left', number>> 碰撞检测应发生的距边界边缘的像素距离。接受一个数字(所有边相同),或一个部分填充对象,例如:{ top: 20, left: 20 }。 | |
disableOutsidePointerEvents | 布尔值 当为 | |
disableUpdateOnLayoutShift | 布尔值 当布局发生偏移时,是否禁用更新内容位置。 | |
forceMount | 布尔值 当需要更多控制时,用于强制挂载。在与 Vue 动画库控制动画时很有用。 | |
hideWhenDetached | 布尔值 当触发器完全被遮挡时,是否隐藏内容。 | |
portal | PopoverPortalProps 用于控制包裹内容的 portal 的属性。 | |
positionStrategy | 'fixed' | 'absolute' 要使用的 CSS position 属性类型。 | |
prioritizePosition | 布尔值 强制内容在视口内定位。 可能与参考元素重叠,这可能不是期望的结果。 | |
reference | ReferenceElement 将设置为浮动元素定位参考的自定义元素或虚拟元素。 如果提供,它将替换默认的锚点元素。 | |
side | 'top' | 'right' | 'bottom' | 'left' 打开时,相对于触发器渲染的首选侧边。当发生碰撞且启用 avoidCollisions 时,将反转。 | |
sideOffset | 数字 与触发器的像素距离。 | |
sticky | '部分' | '始终' 对齐轴上的粘性行为。 | |
updatePositionStrategy | '始终' | '优化' 在每个动画帧更新浮动元素位置的策略。 |
事件触发 | 载荷 |
---|---|
closeAutoFocus | [事件: Event] 关闭时自动聚焦调用的事件处理程序。可阻止其默认行为。 |
escapeKeyDown | [事件: KeyboardEvent] 按下 Esc 键时调用的事件处理程序。可阻止其默认行为。 |
focusOutside | [事件: FocusOutsideEvent] 当焦点移出 |
interactOutside | [事件: PointerDownOutsideEvent | FocusOutsideEvent] 当 |
openAutoFocus | [事件: Event] 打开时自动聚焦调用的事件处理程序。可阻止其默认行为。 |
pointerDownOutside | [事件: PointerDownOutsideEvent] 当 |
箭头
一个可选的箭头元素,用于与弹出框一起渲染。这可以帮助视觉上将锚点与 DateRangePickerContent
连接起来。必须在 DateRangePickerContent
内部渲染。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
高度 | 数字 箭头的像素高度。 | |
rounded | 布尔值 当为 | |
宽度 | 数字 箭头的像素宽度。 |
关闭
关闭已打开日期选择器的按钮。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
锚点
一个可选元素,用于定位 DateRangePickerContent
。如果未使用此部分,内容将与 DateRangePickerTrigger
并排定位。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
reference | ReferenceElement 用于定位的参考(或锚点)元素。 如果未提供,将使用当前组件作为锚点。 |
日历
包含日历的所有部分
插槽(默认) | 载荷 |
---|---|
date | DateValue |
grid | Grid<DateValue>[] |
weekDays | string[] |
weekStartsOn | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
locale | string |
fixedWeeks | 布尔值 |
数据属性 | 值 |
---|---|
[data-readonly] | 只读时存在 |
[data-disabled] | 禁用时存在 |
[data-invalid] | 无效时存在 |
标题
包含导航按钮和标题部分。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
上一页按钮
日历导航按钮。它根据当前日历视图,将日历向前导航一个月/年/十年。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
prevPage | ((placeholder: DateValue) => DateValue) 用于上一页的函数。覆盖 |
插槽(默认) | 载荷 |
---|---|
disabled | 布尔值 当前禁用状态 |
数据属性 | 值 |
---|---|
[data-disabled] | 禁用时存在 |
下一页按钮
日历导航按钮。它根据当前日历视图,将日历导航到未来一个月/年/十年。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
nextPage | ((placeholder: DateValue) => DateValue) 用于下一页的函数。覆盖 |
插槽(默认) | 载荷 |
---|---|
disabled | 布尔值 当前禁用状态 |
数据属性 | 值 |
---|---|
[data-disabled] | 禁用时存在 |
标题
显示当前月份和年份的标题
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
插槽(默认) | 载荷 |
---|---|
headingValue | string 当前月份和年份 |
数据属性 | 值 |
---|---|
[data-disabled] | 禁用时存在 |
网格
用于包裹日历网格的容器。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
数据属性 | 值 |
---|---|
[data-readonly] | 只读时存在 |
[data-disabled] | 禁用时存在 |
网格头部
用于包裹网格头的容器。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
网格主体
用于包裹网格体的容器。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
网格行
用于包裹网格行的容器。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
头部单元格
用于包裹表头单元格的容器。用于显示星期几。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
单元格
用于包裹日历单元格的容器。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
date* | DateValue |
数据属性 | 值 |
---|---|
[data-disabled] | 禁用时存在 |
单元格触发器
用于显示单元格日期的可交互容器。点击可选择日期。
属性 | 默认 | 类型 |
---|---|---|
as | 'div' | AsTag | Component 此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值 更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
day* | DateValue | |
month* | DateValue |
插槽(默认) | 载荷 |
---|---|
dayValue | string 当前日期 |
disabled | 布尔值 当前禁用状态 |
selected | 布尔值 当前选中状态 |
today | 布尔值 当前今日状态 |
outsideView | 布尔值 当前视图外状态 |
outsideVisibleView | 布尔值 当前可见视图外状态 |
unavailable | 布尔值 当前不可用状态 |
highlighted | 布尔值 当前高亮状态 |
highlightedStart | 布尔值 当前高亮起始状态 |
highlightedEnd | 布尔值 当前高亮结束状态 |
selectionStart | 布尔值 当前选中起始状态 |
selectionEnd | 布尔值 当前选中结束状态 |
数据属性 | 值 |
---|---|
[data-selected] | 选中时存在 |
[data-value] | 日期的 ISO 字符串值。 |
[data-disabled] | 禁用时存在 |
[data-unavailable] | 不可用时存在 |
[data-today] | 为今天时存在 |
[data-outside-view] | 当日期不在显示月份范围内时存在。 |
[data-outside-visible-view] | 当日期不在日历可见月份范围内时存在。 |
[data-selection-start] | 当日期为选中范围的起始时存在。 |
[data-selection-end] | 当日期为选中范围的结束时存在。 |
[data-highlighted] | 当用户选择范围时,日期被高亮显示时存在。 |
[data-highlighted-start] | 当日期是用户高亮范围的起始时存在。 |
[data-highlighted-end] | 当日期是用户高亮范围的结束时存在。 |
[data-focused] | 聚焦时存在 |
可访问性
键盘交互
键 | 描述 |
---|---|
Tab 键 | 当焦点移到日期字段时,聚焦第一个片段。 |
空格键 |
当焦点位于 DateRangePickerNext 或 DateRangePickerPrev 时,它会导航日历。否则,它会选择日期。如果焦点位于 DateRangePickerTrigger 上,它会打开/关闭弹出框。
|
回车键 |
当焦点位于 DateRangePickerNext 或 DateRangePickerPrev 时,它会导航日历。否则,它会选择日期。如果焦点位于 DateRangePickerTrigger 上,它会打开/关闭弹出框。
|
向左箭头向右箭头 | 在日期字段分段之间导航。如果焦点位于 DateRangePickerCalendar 上,它会在日期之间导航。 |
向上箭头向下箭头 | 增加/更改分段的值。如果焦点位于 DateRangePickerCalendar 上,它会在日期之间导航。 |
0-9 | 当焦点位于数字 DateRangePickerInput 上时,它会输入数字并在下一个输入会导致无效值时聚焦到下一个分段。 |
Backspace 键 | 从聚焦的数字片段中删除一位数字。 |
AP | 当焦点位于日期时段时,将其设置为上午 (AM) 或 下午 (PM)。 |