日期范围选择器

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


安装

上述命令仅用于单独安装。如果已全局安装 `@heroui/react`,则可以跳过此步骤 @heroui/react is already installed globally.

导入

用法

禁用

只读

必填

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

变体

可见月份

默认情况下,日历弹出框显示单个月份。visibleMonths 属性允许一次显示最多 3 个月,如果屏幕空间允许。

页面行为

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

标签位置

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

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

带有描述

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

带有错误消息

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

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

带有月份和年份选择器

您可以通过将 showMonthAndYearPickers 属性设置为 true,在日历弹出框中显示月份和年份选择器。但是,如果将大于 1 的数字传递给 visibleMonths 属性,将禁用此功能。

带有时间字段

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

选择器图标

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

选择器按钮位置

您可以通过将 selectorButtonPlacement 属性设置为 startend 来更改选择器按钮的位置。

受控

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

时区

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

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

粒度

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

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

最小日期和最大日期

minValuemaxValue 属性也可以用于确保值在特定范围内。

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

国际日历

DateRangePicker 支持在世界各地使用的多种日历系统中选择日期,包括公历、希伯来历、印度历、伊斯兰历、佛教历等等。日期会自动以用户区域设置的适当日历系统显示。可以使用 Unicode 日历区域设置扩展来覆盖日历系统,该扩展传递给 I18nProvider 组件。

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

不可用日期

DateRangePicker 支持将某些日期标记为不可用。用户无法选择这些日期,并且在日历中以删除线外观显示。在日期字段中,如果用户输入了不可用日期,则会显示无效状态。

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

非连续

allowsNonContiguousRanges 属性允许选择范围,即使中间存在不可用日期。在 onChange 事件中发出的值仍然是具有开始和结束属性的单个范围,但不可用日期不会显示为已选中。应用程序需要根据业务逻辑将完整选定的范围拆分为多个。

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

预设

@internationalized/date 包含将多种格式的字符串解析为 ZonedDateTime 对象的功能。

插槽

  • base:基础元素。它处理对齐、放置和整体外观。
  • label:日期范围选择器的标签,它显示在日期输入框的上方、内部或左侧。
  • calendar:日历元素。
  • selectorButton:选择器按钮元素。
  • selectorIcon:选择器图标元素。
  • popoverContent:日历弹出框内容元素。
  • calendarContent:日历内容元素。
  • inputWrapper:包裹 label(当它在内部时)和 innerWrapper
  • input:输入元素。
  • segment:段元素。
  • separator:分隔符元素。
  • bottomContent:底部内容元素。
  • timeInputWrapper:输入元素的包装元素。
  • helperWrapper:包裹 descriptionerrorMessage
  • description:日期输入框的描述。
  • errorMessage:日期输入框的错误消息。

自定义样式

您可以通过将自定义 Tailwind CSS 类传递给组件插槽来自定义 DateRangePicker 组件。

数据属性

DateRangePickerbase 元素上具有以下属性

  • data-slot:所有插槽都具有此属性。表示元素所属的插槽(例如,calendar)。
  • 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
placeholderValue
ZonedDateTime | CalendarDate | CalendarDateTime | undefined | null
description
ReactNode
errorMessage
ReactNode | (v: ValidationResult) => ReactNode
validate
(value: RangeValue<MappedDateValue<DateValue>>) => ValidationError | true | null | undefined
validationBehavior
native | aria
"native"
startContent
ReactNode
endContent
ReactNode
startName
string
endName
string
labelPlacement
inside | outside | outside-left
"inside"
isOpen
boolean
defaultOpen
boolean
false
isRequired
boolean
false
isReadOnly
boolean
false
isDisabled
boolean
false
isInvalid
boolean
false
selectorIcon
ReactNode
pageBehavior
single | visible
"visible"
visibleMonths
number
"1"
autoFocus
boolean
false
hourCycle
12 | 24
granularity
day | hour | minute | second
hideTimeZone
boolean
false
allowsNonContiguousRanges
boolean
false
shouldForceLeadingZeros
boolean
true
calendarWidth
number
"256"
CalendarTopContent
ReactNode
CalendarBottomContent
ReactNode
showMonthAndYearPickers
boolean
false
popoverProps
PopoverProps
"{ placement: "bottom", triggerScaleOnOpen: false, offset: 13 }"
selectorButtonProps
ButtonProps
"{ size: "sm", variant: "light", radius: "full", isIconOnly: true }"
selectorButtonPlacement
start | end
"end"
calendarProps
CalendarProps
timeInputProps
TimeInputProps
disableAnimation
boolean
false
classNames
Partial<Record<"base" | "selectorButton" | "selectorIcon" | "popoverContent" | "calendar" | "calendarContent" | "timeInputLabel" | "timeInput", string>>

DateRangePicker 事件

属性类型默认值
onChange
(value: RangeValue<CalendarDate | CalendarDateTime | ZonedDateTime>) => void
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