Контексты

Пакет headless предоставляет провайдеры контекста, которые оборачивают хуки и предоставляют их состояние через React Context. Это позволяет использовать паттерн составных компонентов — разделять ваш UI на небольшие, сфокусированные подкомпоненты, которые читают состояние из контекста вместо передачи пропсов.

Зачем нужны контексты?

Без контекста вам пришлось бы передавать каждое состояние через пропсы:

// Без контекста -- проброс пропсов (prop drilling)
function MyDatePicker() {
const picker = useDatePicker({ value, onChange });
return (
<MyTrigger displayValue={picker.displayValue} onToggle={picker.handleToggle} />
<MyCalendar calendar={picker.calendar} getDayProps={picker.getDayProps} ... />
<MyFooter onConfirm={picker.handleConfirm} onCancel={picker.handleCancel} ... />
);
}

С контекстом подкомпоненты получают то, что им нужно, напрямую:

// С контекстом -- составные компоненты
function MyDatePicker() {
return (
<DatePickerProvider value={value} onChange={onChange}>
<ExampleWrapper variant="headless" client:visible>
<MyTrigger client:visible />
</ExampleWrapper>
<ExampleWrapper variant="headless" client:visible>
<MyCalendar client:visible />
</ExampleWrapper>
<ExampleWrapper variant="headless" client:visible>
<MyFooter client:visible />
</ExampleWrapper>
</DatePickerProvider>
);
}
function MyTrigger() {
const { displayValue, handleToggle } = useDatePickerContext();
return <button onClick={handleToggle}>{displayValue}</button>;
}

Доступные провайдеры

ПровайдерИспользуемый хук (внутренне)Хук-потребитель
DatePickerProvideruseDatePickeruseDatePickerContext()
DateRangePickerProvideruseDateRangePickeruseDateRangePickerContext()
DateTimePickerProvideruseDateTimePickeruseDateTimePickerContext()
DateRangeTimePickerProvideruseDateRangeTimePickeruseDateRangeTimePickerContext()

Каждый провайдер рендерит как типизированный контекст (специфичный для данного типа выбора), так и унифицированный PickerContext (общий для всех типов).

import {
DatePickerProvider,
DateRangePickerProvider,
DateTimePickerProvider,
DateRangeTimePickerProvider,
} from "react-date-range-picker-headless";

DatePickerProvider

Оборачивает useDatePicker. Предоставляет DatePickerContext + PickerContext.

import type { DatePickerProviderProps } from "react-date-range-picker-headless";
ПропТипОписание
childrenReactNodeОбязательный. Дочерние компоненты.
valueDate | nullОбязательный. Текущая дата.
onChange(date: Date | null) => voidОбязательный. Обработчик изменений.
inlinebooleanОтображать встроенно (без всплывающего окна).
sizeDatePickerSizeВариант размера.
placeholderstringПлейсхолдер триггера.
namestringИмя поля формы.
…restBaseDatePickerOptionsВсе базовые опции (minDate, maxDate, locale и т.д.).

Хук-потребитель: useDatePickerContext() возвращает UseDatePickerReturn.

DateRangePickerProvider

Оборачивает useDateRangePicker. Предоставляет DateRangePickerContext + PickerContext.

import type { DateRangePickerProviderProps } from "react-date-range-picker-headless";
ПропТипОписание
childrenReactNodeОбязательный. Дочерние компоненты.
value{ start: Date | null; end: Date | null }Обязательный. Текущий диапазон.
onChange(value: { start: Date | null; end: Date | null }) => voidОбязательный. Обработчик изменений.
inlinebooleanОтображать встроенно.
sizeDatePickerSizeВариант размера.
placeholderstringПлейсхолдер