日期范围选择器

日期范围选择器结合了两个 DateInputs 和一个 RangeCalendar 弹出框,允许用户输入或选择日期和时间范围。


安装

npx nextui-cli@latest add date-picker
以上命令仅用于单个安装。如果 @nextui-org/react 已全局安装,则可以跳过此步骤。

导入

使用

禁用

只读

必填

如果将 isRequired 属性传递给输入,它将在标签末尾显示一个 danger 星号,并且输入将变为必填。

变体

可见月份

默认情况下,日历弹出窗口显示单个月份。 visibleMonths 属性允许一次显示最多 3 个月,前提是屏幕空间允许。

页面行为

默认情况下,当按下下一个或上一个按钮时,分页将按 visibleMonths 值前进。可以通过将 pageBehavior 设置为 single 来更改此行为,改为按单个月份分页。

标签位置

您可以通过将 labelPlacement 属性设置为 insideoutsideoutside-left 来更改标签的位置。

注意:如果未传递 label,则 labelPlacement 属性默认将为 outside

带描述

您可以通过传递 description 属性为输入添加描述。

带错误消息

您可以结合使用 isInvaliderrorMessage 属性来显示无效输入。

您也可以将错误消息作为函数传递。这允许根据 ValidationResult 进行动态错误消息处理。

带时间字段

当提供 CalendarDateTimeZonedDateTime 对象作为值时,DateRangePicker 会自动包含时间字段。

选择器图标

您可以使用 selector 属性在日期范围选择器的开始和结束位置添加内容。

受控

您可以使用 valueonChange 属性来控制输入值。

时区

当提供 ZonedDateTime 对象作为值时,DateRangePicker 会感知时区。在这种情况下,会显示时区缩写,并且在操作值时会考虑时区问题,例如夏令时。

@internationalized/date 包含用于将字符串解析为 ZonedDateTime 对象的多种格式的函数。

npm install @internationalized/date
import {parseZonedDateTime} from "@internationalized/date";

粒度

granularity 属性允许您控制 DateRangePicker 显示的最小单位。默认情况下,值以“天”粒度(年、月、日)显示,CalendarDateTimeZonedDateTime 值以“分钟”粒度显示。

@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: 包裹 descriptionerrorMessage 的元素。
  • description: 日期输入的描述。
  • errorMessage: 日期输入的错误消息。

数据属性

DateRangePickerbase 元素上具有以下属性

  • 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 属性

属性类型描述默认值
labelReactNode显示为标签的内容。-
valueRangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null日期范围选择器的当前值(受控)。-
variantflat | bordered | faded | underlined日期输入的变体。flat
colordefault | primary | secondary | success | warning | danger日期输入的颜色。default
sizesm | md | lg日期输入的大小。md
radiusnone | sm | md | lg | full日期输入的圆角。-
minValueRangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null日期范围选择器的最小值。-
maxValueRangeValue<CalendarDate | CalendarDateTime | ZonedDateTime> | undefined | null日期范围选择器的最大值。-
defaultValuestring | undefined日期范围选择器的默认值(非受控)。-
placeholderValueZonedDateTime | CalendarDate | CalendarDateTime | undefined | null日期范围选择器的占位符。-
descriptionReactNode日期范围选择器的描述。提供提示,例如选择内容的具体要求。-
errorMessageReactNode | (v: ValidationResult) => ReactNode日期输入的错误消息。-
validate(value: RangeValue<MappedDateValue<DateValue>>) => ValidationError | true | null | undefined在提交时(例如,在失焦时)验证输入值,返回无效值的错误消息。如果 validationBehavior 设置为 native,则在表单提交时显示验证错误。对于实时验证,请使用 isInvalid 属性。-
validationBehaviornative | aria是否使用原生 HTML 表单验证来阻止表单提交时值缺失或无效,或者通过 ARIA 标记字段为必填或无效。aria
startContentReactNode在日期范围选择器左侧渲染的元素。-
endContentReactNode在日期范围选择器右侧渲染的元素。-
startNamestring开始日期输入元素的名称,用于提交 HTML 表单。参见 MDN-
endNamestring结束日期输入元素的名称,用于提交 HTML 表单。参见 MDN-
labelPlacementinside | outside | outside-left标签的位置。内部
isOpen布尔值日期选择器弹出窗口是否打开。-
defaultOpen布尔值日期选择器弹出窗口默认是否打开。false
isRequired布尔值在提交表单之前,是否需要在日期范围选择器上进行用户输入。false
isReadOnly布尔值日期范围选择器是否可以被选中,但不能被用户更改。
isDisabled布尔值日期范围选择器是否被禁用。false
isInvalid布尔值日期范围选择器是否无效。false
selectorIconReactNode用于切换日期选择器弹出窗口的图标。通常是日历图标。
pageBehaviorsingle | visible控制分页的行为。分页可以通过 visibleDuration (默认) 或 visibleDuration 的一个单位来推进可见页面。visible
visibleMonths数字一次显示的月份数。最多支持 3 个月。1
autoFocus布尔值元素是否应该在渲染时获得焦点。false
hourCycle12 | 24是否以 12 小时或 24 小时格式显示时间。这由用户的区域设置决定。-
granularityday | hour | minute | second确定日期选择器中显示的最小单位。通常是日期的“day”。-
hideTimeZone布尔值是否隐藏时区缩写。false
allowsNonContiguousRanges布尔值isDateUnavailable 结合使用时,确定是否可以选中非连续范围,即包含不可用日期的范围。false
shouldForceLeadingZeros布尔值是否始终在月份、日期和小时字段中显示前导零。true
calendarWidth数字应用于日历组件的宽度。256
CalendarTopContentReactNode在日历组件中渲染的顶部内容。
CalendarBottomContentReactNode在日历组件中渲染的底部内容。
allowsNonContiguousRanges布尔值即使中间有不可用的日期,也可以选择一个范围。false
popoverPropsPopoverProps传递给弹出框组件的属性。{ placement: "bottom", triggerScaleOnOpen: false, offset: 13 }
selectorButtonPropsButtonProps传递给选择器按钮组件的属性。{ size: "sm", variant: "light", radius: "full", isIconOnly: true }
calendarPropsCalendarProps传递给选择器按钮组件的属性。{ size: "sm", variant: "light", radius: "full", isIconOnly: true }
timeInputPropsTimeInputProps传递给时间输入组件的属性。{ size: "sm", variant: "light", radius: "full", isIconOnly: true }
disableAnimation布尔值是否禁用日期选择器中的所有动画。包括日期输入、按钮、日历和弹出框。false
classNamesRecord<"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当释放键时调用的处理程序。-