日期范围选择器
日期范围选择器结合了两个 DateInputs 和一个 RangeCalendar 弹出框,允许用户输入或选择日期和时间范围。
安装
npx nextui-cli@latest add date-picker
以上命令仅用于单个安装。如果 @nextui-org/react
已全局安装,则可以跳过此步骤。
导入
使用
禁用
只读
必填
如果将 isRequired
属性传递给输入,它将在标签末尾显示一个 danger
星号,并且输入将变为必填。
变体
可见月份
默认情况下,日历弹出窗口显示单个月份。 visibleMonths
属性允许一次显示最多 3 个月,前提是屏幕空间允许。
页面行为
默认情况下,当按下下一个或上一个按钮时,分页将按 visibleMonths
值前进。可以通过将 pageBehavior
设置为 single
来更改此行为,改为按单个月份分页。
标签位置
您可以通过将 labelPlacement
属性设置为 inside
、outside
或 outside-left
来更改标签的位置。
注意:如果未传递
label
,则labelPlacement
属性默认将为outside
。
带描述
您可以通过传递 description
属性为输入添加描述。
带错误消息
您可以结合使用 isInvalid
和 errorMessage
属性来显示无效输入。
您也可以将错误消息作为函数传递。这允许根据 ValidationResult 进行动态错误消息处理。
带时间字段
当提供 CalendarDateTime
或 ZonedDateTime
对象作为值时,DateRangePicker 会自动包含时间字段。
选择器图标
您可以使用 selector
属性在日期范围选择器的开始和结束位置添加内容。
受控
您可以使用 value
和 onChange
属性来控制输入值。
时区
当提供 ZonedDateTime
对象作为值时,DateRangePicker 会感知时区。在这种情况下,会显示时区缩写,并且在操作值时会考虑时区问题,例如夏令时。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date
import {parseZonedDateTime} from "@internationalized/date";
粒度
granularity 属性允许您控制 DateRangePicker 显示的最小单位。默认情况下,值以“天”粒度(年、月、日)显示,CalendarDateTime
和 ZonedDateTime
值以“分钟”粒度显示。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date @react-aria/i18n
import {DateValue, now, parseAbsoluteToLocal} from "@internationalized/date";import {useDateFormatter} from "@react-aria/i18n";
最小日期和最大日期
minValue 和 maxValue 属性也可以用来确保值在特定范围内。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date
import {getLocalTimeZone, parseDate, today} from "@internationalized/date";
国际日历
DateRangePicker 支持选择世界各地使用的多种日历系统中的日期,包括公历、希伯来历、印度历、伊斯兰历、佛教历等等。日期会自动根据用户的区域设置以相应的日历系统显示。可以使用 Unicode 日历区域设置扩展 来覆盖日历系统,该扩展传递给 I18nProvider 组件。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date @react-aria/i18n
import {DateValue, now, parseAbsoluteToLocal} from "@internationalized/date";import {I18nProvider} from "@react-aria/i18n";
不可用日期
DateRangePicker 支持将某些日期标记为不可用。用户无法选择这些日期,并且它们在日历中以划掉的形式显示。如果用户输入不可用日期,则日期字段将显示无效状态。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date @react-aria/i18n
import {today, isWeekend, getLocalTimeZone} from "@internationalized/date";import {useLocale} from "@react-aria/i18n";
非连续
allowsNonContiguousRanges 属性允许即使中间有不可用日期也能选择范围。onChange 事件中发出的值仍然是一个具有开始和结束属性的单个范围,但不可用日期不会显示为选中状态。应用程序需要根据业务逻辑将完整的选中范围拆分为多个范围。
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date @react-aria/i18n
import {today, isWeekend, getLocalTimeZone} from "@internationalized/date";import {useLocale} from "@react-aria/i18n";
预设
@internationalized/date 包含用于将字符串解析为 ZonedDateTime
对象的多种格式的函数。
npm install @internationalized/date @react-aria/i18n
import {DateValue,now,startOfWeek,startOfMonth,getLocalTimeZone,} from "@internationalized/date";import {useLocale, useDateFormatter} from "@react-aria/i18n";
插槽
- base: 基础元素。它处理对齐、放置和整体外观。
- label: 日期范围选择器的标签,它显示在日期输入的上方、内部或左侧。
- calendar: 日历元素。
- selectorButton: 选择器按钮元素。
- selectorIcon: 选择器图标元素。
- popoverContent: 日历弹出框元素。
- calendarContent: 日历内容元素。
- inputWrapper: 包裹
label
(当它在内部时)和innerWrapper
的元素。 - input: 输入元素。
- segment: 分段元素。
- separator: 分隔符元素。
- bottomContent: 底部内容元素。
- timeInputWrapper: 输入元素的包装元素。
- helperWrapper: 包裹
description
和errorMessage
的元素。 - description: 日期输入的描述。
- errorMessage: 日期输入的错误消息。
数据属性
DateRangePicker
在 base
元素上具有以下属性
- data-slot: 所有插槽都具有此属性。它表示元素所代表的插槽(例如
canlendar
)。 - data-open: 指示日历弹出窗口是否打开。
- data-invalid: 当日期范围选择器无效时。基于
isInvalid
属性。 - data-required: 当日期范围选择器为必填时。基于
isRequired
属性。 - data-readonly: 当日期范围选择器为只读时。基于
isReadOnly
属性。 - data-disabled: 当日期范围选择器被禁用时。基于
isDisabled
属性。 - data-has-start-content: 当日期范围选择器具有开始内容时。基于
startContent
属性。 - data-has-end-content: 当日期范围选择器具有结束内容时。基于
endContent
属性。 - data-has-multiple-months: 当日期范围选择器的
visibleMonth
超过 2 时。
无障碍功能
- 每个日期和时间单位都显示为一个可单独聚焦和编辑的段,这允许用户使用键盘以任何日期格式和语言环境轻松编辑日期。
- 用户还可以打开日历弹出窗口,以在标准月份网格中选择日期范围。包含本地化的屏幕阅读器消息,以在选择和可见日期范围更改时进行通知。
- 日期段可以使用易于使用的数字键盘进行编辑,日期范围可以通过触摸屏在日历上拖动日期来选择,所有交互都可以通过基于触摸的屏幕阅读器访问。
- 与 HTML 表单集成,支持必填项、最小值和最大值、不可用日期、自定义验证函数、实时验证和服务器端验证错误
API
DateRangePicker 属性
属性 | 类型 | 描述 | 默认值 |
---|---|---|---|
label | ReactNode | 显示为标签的内容。 | - |
value | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | 日期范围选择器的当前值(受控)。 | - |
variant | flat | bordered | faded | underlined | 日期输入的变体。 | flat |
color | default | primary | secondary | success | warning | danger | 日期输入的颜色。 | default |
size | sm | md | lg | 日期输入的大小。 | md |
radius | none | sm | md | lg | full | 日期输入的圆角。 | - |
minValue | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | 日期范围选择器的最小值。 | - |
maxValue | RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null | 日期范围选择器的最大值。 | - |
defaultValue | string | undefined | 日期范围选择器的默认值(非受控)。 | - |
placeholderValue | ZonedDateTime | CalendarDate | CalendarDateTime | undefined | null | 日期范围选择器的占位符。 | - |
description | ReactNode | 日期范围选择器的描述。提供提示,例如选择内容的具体要求。 | - |
errorMessage | ReactNode | (v: ValidationResult) => ReactNode | 日期输入的错误消息。 | - |
validate | (value: RangeValue<MappedDateValue<DateValue>>) => ValidationError | true | null | undefined | 在提交时(例如,在失焦时)验证输入值,返回无效值的错误消息。如果 validationBehavior 设置为 native ,则在表单提交时显示验证错误。对于实时验证,请使用 isInvalid 属性。 | - |
validationBehavior | native | aria | 是否使用原生 HTML 表单验证来阻止表单提交时值缺失或无效,或者通过 ARIA 标记字段为必填或无效。 | aria |
startContent | ReactNode | 在日期范围选择器左侧渲染的元素。 | - |
endContent | ReactNode | 在日期范围选择器右侧渲染的元素。 | - |
startName | string | 开始日期输入元素的名称,用于提交 HTML 表单。参见 MDN | - |
endName | string | 结束日期输入元素的名称,用于提交 HTML 表单。参见 MDN | - |
labelPlacement | inside | outside | outside-left | 标签的位置。 | 内部 |
isOpen | 布尔值 | 日期选择器弹出窗口是否打开。 | - |
defaultOpen | 布尔值 | 日期选择器弹出窗口默认是否打开。 | false |
isRequired | 布尔值 | 在提交表单之前,是否需要在日期范围选择器上进行用户输入。 | false |
isReadOnly | 布尔值 | 日期范围选择器是否可以被选中,但不能被用户更改。 | |
isDisabled | 布尔值 | 日期范围选择器是否被禁用。 | false |
isInvalid | 布尔值 | 日期范围选择器是否无效。 | false |
selectorIcon | ReactNode | 用于切换日期选择器弹出窗口的图标。通常是日历图标。 | |
pageBehavior | single | visible | 控制分页的行为。分页可以通过 visibleDuration (默认) 或 visibleDuration 的一个单位来推进可见页面。 | visible |
visibleMonths | 数字 | 一次显示的月份数。最多支持 3 个月。 | 1 |
autoFocus | 布尔值 | 元素是否应该在渲染时获得焦点。 | false |
hourCycle | 12 | 24 | 是否以 12 小时或 24 小时格式显示时间。这由用户的区域设置决定。 | - |
granularity | day | hour | minute | second | 确定日期选择器中显示的最小单位。通常是日期的“day”。 | - |
hideTimeZone | 布尔值 | 是否隐藏时区缩写。 | false |
allowsNonContiguousRanges | 布尔值 | 与 isDateUnavailable 结合使用时,确定是否可以选中非连续范围,即包含不可用日期的范围。 | false |
shouldForceLeadingZeros | 布尔值 | 是否始终在月份、日期和小时字段中显示前导零。 | true |
calendarWidth | 数字 | 应用于日历组件的宽度。 | 256 |
CalendarTopContent | ReactNode | 在日历组件中渲染的顶部内容。 | |
CalendarBottomContent | ReactNode | 在日历组件中渲染的底部内容。 | |
allowsNonContiguousRanges | 布尔值 | 即使中间有不可用的日期,也可以选择一个范围。 | false |
popoverProps | PopoverProps | 传递给弹出框组件的属性。 | { placement: "bottom", triggerScaleOnOpen: false, offset: 13 } |
selectorButtonProps | ButtonProps | 传递给选择器按钮组件的属性。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
calendarProps | CalendarProps | 传递给选择器按钮组件的属性。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
timeInputProps | TimeInputProps | 传递给时间输入组件的属性。 | { size: "sm", variant: "light", radius: "full", isIconOnly: true } |
disableAnimation | 布尔值 | 是否禁用日期选择器中的所有动画。包括日期输入、按钮、日历和弹出框。 | false |
classNames | Record<"base" | "selectorButton" | "selectorIcon" | "popoverContent" | "calendar" | "calendarContent" | "timeInputLabel" | "timeInput", string> | 允许为日期范围选择器插槽设置自定义类名。 | - |
DateRangePicker 事件
属性 | 类型 | 描述 | |
---|---|---|---|
onChange | ((value: RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime>) => void) | undefined | 当日期范围选择器的值发生变化时调用的处理程序。 | - |
onOpenChange | (isOpen: boolean) => void | 当日期选择器弹出框打开或关闭时调用的处理程序。 | - |
onFocus | (e: FocusEvent<HTMLInputElement>) => void | 当元素获得焦点时调用的处理程序。 | - |
onBlur | (e: FocusEvent<HTMLInputElement>) => void | 当元素失去焦点时调用的处理程序。 | - |
onFocusChange | (isFocused: boolean) => void | 当元素的焦点状态发生变化时调用的处理程序。 | - |
onKeyDown | (e: KeyboardEvent) => void | 当按下键时调用的处理程序。 | - |
onKeyUp | (e: KeyboardEvent) => void | 当释放键时调用的处理程序。 | - |