ProComponents, templates & AI tooling
HeroUI
27.7k

DateRangePicker 日期范围选择器

基于 React Aria DateRangePicker,通过 DateField 与 RangeCalendar 组合的可组合日期范围选择器

用法

import { DateField, DateRangePicker, Label, RangeCalendar } from '@heroui/react';

组件结构

DateRangePicker 采用组合优先 API。显式组合 DateFieldRangeCalendar 以控制结构与样式。

import {DateField, DateRangePicker, Label, RangeCalendar} from '@heroui/react';

export default () => (
  <DateRangePicker>
    <Label />
    <DateField.Group>
      <DateField.InputContainer>
        <DateField.Input slot="start">
          {(segment) => <DateField.Segment segment={segment} />}
        </DateField.Input>
        <DateRangePicker.RangeSeparator />
        <DateField.Input slot="end">
          {(segment) => <DateField.Segment segment={segment} />}
        </DateField.Input>
      </DateField.InputContainer>
      <DateField.Suffix>
        <DateRangePicker.Trigger>
          <DateRangePicker.TriggerIndicator />
        </DateRangePicker.Trigger>
      </DateField.Suffix>
    </DateField.Group>
    <DateRangePicker.Popover>
      <RangeCalendar aria-label="Choose trip dates">
        <RangeCalendar.Header>
          <RangeCalendar.YearPickerTrigger>
            <RangeCalendar.YearPickerTriggerHeading />
            <RangeCalendar.YearPickerTriggerIndicator />
          </RangeCalendar.YearPickerTrigger>
          <RangeCalendar.NavButton slot="previous" />
          <RangeCalendar.NavButton slot="next" />
        </RangeCalendar.Header>
        <RangeCalendar.Grid>
          <RangeCalendar.GridHeader>
            {(day) => <RangeCalendar.HeaderCell>{day}</RangeCalendar.HeaderCell>}
          </RangeCalendar.GridHeader>
          <RangeCalendar.GridBody>{(date) => <RangeCalendar.Cell date={date} />}</RangeCalendar.GridBody>
        </RangeCalendar.Grid>
      </RangeCalendar>
    </DateRangePicker.Popover>
  </DateRangePicker>
)

示例

禁用

受控组件

表单校验

格式选项

使用 granularityhourCyclehideTimeZoneshouldForceLeadingZeros 等 props 控制 DateRangePicker 值的显示方式。

表单示例

自定义指示器

未提供 children 时,DateRangePicker.TriggerIndicator 渲染默认 IconCalendar。传入 children 可替换。

渲染函数

国际化日历

默认情况下,DateRangePicker 使用用户 locale 的日历系统显示日期。可用 I18nProvider 包裹并设置 Unicode 日历 locale 扩展 覆盖。

以下示例展示印度日历系统:

Note: 无论显示的 locale 如何,onChange 事件始终返回与 valuedefaultValue 相同日历系统的日期(未提供 value 时为 Gregorian)。

完整支持的日历系统及其标识符列表请参阅:

自定义样式

Tailwind CSS

全局 CSS

使用 @layer components 自定义 DateRangePicker 基础类。

@layer components {
  .date-range-picker {
    @apply inline-flex flex-col gap-1;
  }

  .date-range-picker__trigger {
    @apply inline-flex items-center justify-between;
  }

  .date-range-picker__trigger-indicator {
    @apply text-muted;
  }

  .date-range-picker__range-separator {
    @apply px-2 text-default;
  }

  .date-range-picker__popover {
    @apply min-w-[var(--trigger-width)] p-0;
  }
}

样式参考

HeroUI 遵循 BEM 方法论,确保组件变体与状态可复用且易于自定义。

CSS 类

DateRangePicker 在 packages/styles/components/date-range-picker.css 中使用以下类:

  • .date-range-picker - 根包裹层
  • .date-range-picker__trigger - 打开 popover 的触发器部分
  • .date-range-picker__trigger-indicator - 默认/自定义指示器 slot
  • .date-range-picker__range-separator - 开始与结束日期输入之间的分隔符
  • .date-range-picker__popover - Popover 内容包裹层

交互状态

DateRangePicker 支持 React Aria data 属性与伪状态:

  • Open:触发器上 [data-open="true"]
  • Disabled:触发器上 [data-disabled="true"][aria-disabled="true"]
  • Focus visible:触发器上 :focus-visible[data-focus-visible="true"]
  • Hover:触发器上 :hover[data-hovered="true"]

API 参考

DateRangePicker

DateRangePicker 继承 React Aria DateRangePicker 的所有 props。

Prop类型默认值描述
value{ start: DateValue; end: DateValue } | null-受控选中日期范围值
defaultValue{ start: DateValue; end: DateValue } | null-非受控模式下的默认选中范围
onChange(value: { start: DateValue; end: DateValue } | null) => void-选中范围变化时调用
isOpenboolean-受控 popover 打开状态
defaultOpenbooleanfalse初始 popover 打开状态
onOpenChange(isOpen: boolean) => void-popover 打开状态变化时调用
isDisabledbooleanfalse禁用范围选择与触发器交互
isInvalidboolean-标记字段为无效以显示校验状态
minValueDateValue-最小可选日期
maxValueDateValue-最大可选日期
startNamestring-HTML 表单提交时开始日期的 name
endNamestring-HTML 表单提交时结束日期的 name
childrenReactNode | (values: DateRangePickerRenderProps) => ReactNode-组合内容或 render 函数
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, DateRangePickerRenderProps>-使用自定义 render 函数覆盖默认 DOM 元素

Composition Parts

ComponentDescription
DateRangePicker.Root根 date range picker 容器与状态所有者
DateRangePicker.Trigger触发按钮,通常渲染在 DateField.Suffix
DateRangePicker.TriggerIndicator带默认日历图标的指示器 slot
DateRangePicker.RangeSeparator开始与结束日期输入之间的分隔符部分
DateRangePicker.PopoverRangeCalendar 内容的 Popover 包裹层
  • @internationalized/date — 所有日期组件使用的日期类型(CalendarDateCalendarDateTimeZonedDateTime)与工具
  • I18nProvider — 为子树覆盖 locale
  • useLocale — 读取当前 locale 与布局方向

相关组件

本页目录