useDateTimePicker

用于组合日期和时间选择的 Hook。它扩展了 useDatePicker,增加了时间状态(小时、分钟、秒、时间段)和一个嵌套的时间选择器。

导入

import { useDateTimePicker } from "react-date-range-picker-headless";

用法

import { useState } from "react";
import { useDateTimePicker } from "react-date-range-picker-headless";
function MyDateTimePicker() {
const [dateTime, setDateTime] = useState<Date | null>(null);
const picker = useDateTimePicker({
value: dateTime,
onChange: setDateTime,
time: { precision: "minute", hourFormat: "24", minuteStep: 5 },
});
return (
<div ref={picker.containerRef}>
<button onClick={picker.handleToggle}>
{picker.displayValue || picker.locale.dateTimePlaceholder}
</button>
{picker.isOpen && (
<div ref={picker.popupRef} onKeyDown={picker.handleKeyDown}>
{/* 日历 (与 useDatePicker 相同) */}
<div>
<button onClick={picker.handlePrevMonth}>{picker.locale.prevMonth}</button>
<span>{picker.locale.formatMonthYear(picker.calendar.month)}</span>
<button onClick={picker.handleNextMonth}>{picker.locale.nextMonth}</button>
</div>
{/* ...日历网格... */}
{/* 时间显示 */}
<div>
<span>时间: {picker.timeDisplayValue}</span>
</div>
{/* 时间控件 */}
<div>
<input
type="number"
value={picker.tempHour}
onChange={(e) => picker.handleHourChange(Number(e.target.value))}
/>
<span>:</span>
<input
type="number"
value={picker.tempMinute}
onChange={(e) => picker.handleMinuteChange(Number(e.target.value))}
/>
</div>
<button onClick={picker.handleConfirm}>{picker.locale.confirm}</button>
</div>
)}
</div>
);
}

选项

选项类型默认值描述
valueDate | null必需。 当前的日期时间值。
onChange(dateTime: Date | null) => void必需。 当日期时间更改时调用。
timeTimeConfig{ precision: "minute", hourFormat: "24", minuteStep: 5, secondStep: 1 }时间选择器配置。
minDateDate最早可选日期。
maxDateDate最晚可选日期。
localePartial<Locale>DEFAULT_LOCALE覆盖本地化字符串。
initialMonthDate要显示的初始月份。
sizeDatePickerSizeUI 传递。
weekStartsOnWeekDay"sunday"一周的第一天。
isDateUnavailable(date: Date) => boolean用于禁用特定日期的自定义函数。
displayFormatstring用于显示值的自定义格式字符串。
openboolean受控的打开状态。
initialOpenbooleanfalse初始打开状态。
onOpenChange(open: boolean) => void当打开状态更改时的回调。
requiredbooleanfalse当为 true 时,handleClear 是一个空操作。
todayDatenew Date()覆盖今天的日期。
onMonthChange(month: Date) => void当月份更改时的回调。
disablePastbooleanfalse禁用过去的日期。
disableFuturebooleanfalse禁用未来的日期。
showOutsideDaysbooleanfalse显示相邻月份的日期。
highlightDatesDate[]要高亮的日期。
shouldCloseOnSelectbooleanfalse对于日期时间选择器,仅适用于预设点击,不适用于日期点击。
numberOfMonthsnumber1日历月份的数量。
captionLayoutCaptionLayout"buttons"标题布局模式。
fromYearnumbercurrent year - 100下拉菜单的起始年份。
toYearnumbercurrent year + 10下拉菜单的结束年份。

返回值

日期状态

名称类型描述
isOpenboolean弹出窗口是否打开。
tempDateDate | null临时选择的日期。
currentMonthDate当前显示的月份。
localeLocale解析后的本地化对象。

时间状态

名称类型描述
isTimePickerOpenboolean时间选择器子面板是否打开。
tempHournumber当前的临时小时值。
tempMinutenumber当前的临时分钟值。
tempSecondnumber当前的临时秒值。
tempPeriodTimePeriod当前的 AM/PM 时段("AM""PM")。

日期操作

名称类型描述
handleDateClick(date: Date) => void处理日期单元格点击。
handlePrevMonth() => void导航到上一个月。
handleNextMonth() => void导航到下一个月。
handleOpen() => void打开弹出窗口。
handleClose() => void关闭弹出窗口。
handleToggle() => void切换弹出窗口。
handleConfirm() => void确认日期和时间并关闭。
handleCancel() => void取消并还原。
handleClear() => void清除值。
handleGoToToday() => void导航到今天。

时间操作

名称类型描述
handleHourChange(hour: number) => void更新小时。
handleMinuteChange(minute: number) => void更新分钟。
handleSecondChange(second: number) => void更新秒。
handlePeriodChange(period: TimePeriod) => void切换 AM/PM。
handleTimePickerOpen() => void打开时间选择器子面板。
handleTimePickerClose() => void关闭时间选择器子面板。
handleTimePickerConfirm() => void确认时间选择器子面板。
handleTimePickerCancel() => void取消时间选择器子面板。

计算值

名称类型描述
calendarCalendarMonth当前月份的日历数据。
calendarsCalendarMonth[]日历月份数组。
getDayProps(date: Date, referenceMonth?: Date) => DayProps日期单元格的 props。
displayValuestring格式化的日期时间字符串。
timeDisplayValuestring格式化的时间字符串。
hasValueboolean值是否已确认。
canConfirmboolean确认是否有效。
containerRefRefObject<HTMLDivElement | null>容器 ref。
popupRefRefObject<HTMLDivElement | null>弹出窗口 ref。
timePickerRefRefObject<HTMLDivElement | null>时间选择器子面板 ref。
focusedDateDate | null键盘聚焦的日期。
handleKeyDown(e: KeyboardEvent<HTMLElement>) => void键盘处理器。
resolvedTimeConfigRequired<TimeConfig>已解析并填充默认值的时间配置。
yearsnumber[]下拉模式的年份。
monthsnumber[]下拉模式的月份。
handleYearSelect(year: number, calendarIndex?: number) => void设置年份。
handleMonthSelect(month: number, calendarIndex?: number) => void设置月份。

关键行为

时间配置

time 选项接受一个 TimeConfig 对象:

interface TimeConfig {
precision?: "hour" | "minute" | "second"; // default: "minute"
hourFormat?: "12" | "24"; // default: "24"
minuteStep?: 1 | 2 | 3 | 5 | 10 | 15 | 20 | 30; // default: 5
secondStep?: 1 | 2 | 3 | 5 | 10 | 15 | 20 | 30; // default: 1
itemHeight?: number; // default: 32
}

shouldCloseOnSelect

对于日期时间选择器,shouldCloseOnSelect 仅在 点击预设值 时触发,而不是在点击日期时触发。这是因为用户在选择日期后仍需要设置时间。

resolvedTimeConfig

resolvedTimeConfig 返回值包含完全解析并填充了所有默认值的时间配置。在构建与时间相关的 UI 组件时使用此值,以避免重新计算默认值。