Headless (без интерфейса)
Headless-пакет (react-date-range-picker-headless) предоставляет нестилизованные хуки и провайдеры контекста. Он содержит всю логику управления состоянием, календарём, навигацией с клавиатуры и доступностью, но не имеет никакого CSS и не навязывает определённую разметку.
Вы создаёте свой собственный интерфейс.
Установка
npm install react-date-range-picker-headless
Когда использовать Headless
- У вас есть дизайн-система с собственной библиотекой компонентов
- Вам нужен полный контроль над каждым элементом с точностью до пикселя
- Вы создаёте кастомный выбор даты для конкретного случая использования
- Вы хотите интегрироваться с CSS-фреймворком, который не поддерживается стилизованными пакетами
Если вам нужны готовые к использованию стилизованные компоненты, смотрите Styled, Tailwind v4 или Tailwind v3.
Как это работает
- Выберите хук в зависимости от вашего сценария использования
- Передайте опции (value, onChange, config)
- Получите обратно состояние и обработчики
- Отрендерьте свой собственный UI, используя полученные значения
import { useState } from "react";import { useDatePicker } from "react-date-range-picker-headless";function MyDatePicker() { const [value, setValue] = useState<Date | null>(null);
const { isOpen, calendar, getDayProps, displayValue, handleToggle, handleDateClick, handleConfirm, handlePrevMonth, handleNextMonth, locale, } = useDatePicker({ value, onChange: setValue });
return ( <div> <button onClick={handleToggle}>{displayValue || locale.placeholder}</button> {isOpen && ( <div> <div> <button onClick={handlePrevMonth}>{locale.prevMonth}</button> <span>{locale.formatMonthYear(calendar.month)}</span> <button onClick={handleNextMonth}>{locale.nextMonth}</button> </div> <div style={{ display: "grid", gridTemplateColumns: "repeat(7, 1fr)" }}> {calendar.weeks.flat().map((day, i) => { if (!day) return <span key={i} />; const props = getDayProps(day); return ( <button key={i} onClick={() => handleDateClick(day)} style={{ background: props.isSelected ? "#0ea5e9" : "transparent", color: props.isDisabled ? "#ccc" : props.isToday ? "#0ea5e9" : "inherit", }} > {props.day} </button> ); })} </div> <button onClick={handleConfirm}>{locale.confirm}</button> </div> )} </div> );}Доступные хуки
| Хук | Сценарий использования |
|---|---|
useDatePicker | Выбор одной даты |
useDateRangePicker | Выбор диапазона дат с двумя календарями |
useDateTimePicker | Выбор даты и времени |
useDateRangeTimePicker | Выбор диапазона дат и времени |
useTimePicker | Колесо прокрутки только для времени |
useStandaloneTimePicker | Выбор времени с поведением открытия/закрытия |
Следующие шаги
- Создание кастомного UI — Полное руководство по использованию headless-подхода
- Справочник по хукам — Подробная документация по хукам
- Контексты — Паттерн провайдера для составных компонентов
- Утилиты для дат — Вспомогательные функции, экспортируемые из headless-пакета