useDateRangePicker

用于日期范围选择的 Hook,支持双月日历、悬停预览和预设范围。

导入

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

用法

import { useState } from "react";
import { useDateRangePicker } from "react-date-range-picker-headless";
function MyDateRangePicker() {
const [range, setRange] = useState<{ start: Date | null; end: Date | null }>({
start: null,
end: null,
});
const picker = useDateRangePicker({
value: range,
onChange: setRange,
presets: [
{
label: "Last 7 days",
value: () => {
const end = new Date();
const start = new Date();
start.setDate(start.getDate() - 6);
return { start, end };
},
},
],
});
return (
<div ref={picker.containerRef}>
<button onClick={picker.handleToggle}>
{picker.displayValue || picker.locale.rangePlaceholder}
</button>
{picker.isOpen && (
<div ref={picker.popupRef} onKeyDown={picker.handleKeyDown}>
{/* 并排显示两个日历 */}
{[picker.leftCalendar, picker.rightCalendar].map((cal, calIdx) => (
<div key={calIdx}>
<span>{picker.locale.formatMonthYear(cal.month)}</span>
{cal.weeks.flat().map((day, i) => {
if (!day) return <span key={i} />;
const dp = picker.getDayProps(day, cal.month);
return (
<button
key={i}
onClick={() => picker.handleDateClick(day)}
onMouseEnter={() => picker.handleDateHover(day)}
onMouseLeave={() => picker.handleDateHover(null)}
>
{dp.day}
</button>
);
})}
</div>
))}
{/* 预设 */}
{picker.presets.map((preset, i) => (
<button
key={i}
onClick={() => picker.handlePresetClick(preset)}
style={{ fontWeight: i === picker.activePresetIndex ? "bold" : "normal" }}
>
{preset.label}
</button>
))}
<button onClick={picker.handleConfirm}>{picker.locale.confirm}</button>
</div>
)}
</div>
);
}

选项

选项类型默认值描述
value{ start: Date | null; end: Date | null }必需。 当前的范围值。
onChange(value: { start: Date | null; end: Date | null }) => void必需。 当范围更改时调用。
maxDaysnumber一个范围内允许的最大天数(含)。
minDaysnumber一个范围内要求的最小天数(含)。
presetsDateRangePreset[]预定义的日期范围预设(例如“过去 7 天”,“本月”)。
allowSingleDateInRangebooleantrue当为 false 时,阻止选择开始日期等于结束日期的范围。
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选择结束日期时自动确认。
numberOfMonthsnumber2要显示的日历月份数量。
captionLayoutCaptionLayout"buttons"标题布局模式。
fromYearnumbercurrent year - 100下拉菜单的起始年份。
toYearnumbercurrent year + 10下拉菜单的结束