useDateField — хук из библиотеки React Aria,
предназначенный для создания полностью доступного компонента ввода даты.
Он реализует сложную логику работы с датами: разбиение значения на
сегменты, управление клавиатурной навигацией, поддержку локализации, а
также взаимодействие со вспомогательными технологиями.
Компонент поля даты состоит из отдельных сегментов (день, месяц, год и другие части), каждый из которых редактируется независимо. Такое представление делает ввод даты более удобным и позволяет точно контролировать структуру значения.
useDateField отвечает за:
Для полноценной работы хук обычно используется совместно с состоянием из библиотеки React Stately.
Поле даты в системе React Aria состоит из нескольких уровней:
1. Контейнер поля
Главный элемент, который объединяет все сегменты.
2. Сегменты даты
Отдельные части значения:
3. Управление состоянием
Состояние управляется хуком useDateFieldState.
4. Сегментный ввод
Каждый сегмент редактируется с помощью
useDateSegment.
Схематически структура выглядит следующим образом:
DateField
├─ DateSegment (day)
├─ DateSegment (month)
├─ DateSegment (year)
└─ DateSegment (literal separators)
Сегменты могут содержать как редактируемые значения, так и
статические разделители (например / или
.).
Для создания поля даты требуется несколько пакетов:
npm install @react-aria/datepicker
npm install @react-stately/datepicker
npm install @internationalized/date
Каждый пакет отвечает за отдельную часть системы:
| Пакет | Назначение |
|---|---|
| React Aria | доступность и поведение |
| React Stately | управление состоянием |
| internationalized/date | работа с календарями и датами |
useDateFieldМинимальная реализация компонента поля даты включает три ключевых элемента:
useDateFieldimport {useRef} from "react";
import {useDateField} from "@react-aria/datepicker";
import {useDateFieldState} from "@react-stately/datepicker";
import {useLocale} from "@react-aria/i18n";
function DateField(props) {
let {locale} = useLocale();
let state = useDateFieldState({
...props,
locale
});
let ref = useRef();
let {fieldProps} = useDateField(props, state, ref);
return (
<div {...fieldProps} ref={ref}>
{state.segments.map((segment, i) => (
<DateSegment key={i} segment={segment} state={state} />
))}
</div>
);
}
В данном коде:
useDateFieldState хранит значение даты и управляет
сегментамиuseDateField обеспечивает доступностьstate.segments содержит список сегментов для
отображенияКаждый сегмент представляет отдельную часть даты. Он может быть:
Для работы с сегментами используется хук
useDateSegment.
import {useRef} from "react";
import {useDateSegment} from "@react-aria/datepicker";
function DateSegment({segment, state}) {
let ref = useRef();
let {segmentProps} = useDateSegment(segment, state, ref);
return (
<span {...segmentProps} ref={ref}>
{segment.text}
</span>
);
}
Сегмент автоматически получает:
React Aria разделяет сегменты на несколько типов.
| Тип | Назначение |
|---|---|
day |
день месяца |
month |
месяц |
year |
год |
hour |
часы |
minute |
минуты |
second |
секунды |
dayPeriod |
AM/PM |
literal |
разделители |
Пример массива сегментов:
[
{ type: "day", text: "12" },
{ type: "literal", text: "/" },
{ type: "month", text: "05" },
{ type: "literal", text: "/" },
{ type: "year", text: "2026" }
]
Состояние поля даты может управляться:
<DateField
value={date}
onCha nge={setDate}
/>
В этом случае:
value хранит текущее значениеonChange вызывается при измененииТип значения — объект из библиотеки
@internationalized/date.
CalendarDateДля хранения дат применяется специализированный тип:
import {CalendarDate} from "@internationalized/date";
let date = new CalendarDate(2026, 3, 16);
Преимущества такого подхода:
useDateField реализует богатую систему клавиатурного
управления.
| Клавиша | Действие |
|---|---|
| ArrowLeft | переход к предыдущему сегменту |
| ArrowRight | переход к следующему сегменту |
| ArrowUp | увеличение значения |
| ArrowDown | уменьшение значения |
| Tab | переход между элементами интерфейса |
| цифры | ввод значения |
Если фокус находится на сегменте дня:
ArrowUp → 15 → 16
ArrowDown → 15 → 14
Ввод даты может быть частичным. Например:
__/__/2026
React Aria корректно обрабатывает такие состояния:
useDateField автоматически адаптируется под локаль.
Локаль влияет на:
| Локаль | Формат |
|---|---|
| США | MM/DD/YYYY |
| Германия | DD.MM.YYYY |
| Япония | YYYY/MM/DD |
Локаль определяется через useLocale.
import {useLocale} from "@react-aria/i18n";
let {locale} = useLocale();
Поле даты поддерживает ограничения диапазона.
<DateField
minValue={new CalendarDate(2020,1,1)}
maxValue={new CalendarDate(2030,12,31)}
/>
Если пользователь пытается выйти за пределы диапазона:
useDateFieldState содержит встроенную систему
валидации.
Состояние предоставляет свойства:
isInvalidvalidationErrorsПример:
if (state.isInvalid) {
console.log(state.validationErrors);
}
Фокус автоматически перемещается между сегментами.
Особенности реализации:
Это улучшает доступность и скорость редактирования.
useDateField часто используется вместе с календарём.
Типичная структура компонента:
DatePicker
├─ DateField
└─ Calendar
Поле отвечает за текстовый ввод, а календарь — за выбор даты мышью.
Обе части используют общее состояние.
Библиотека @internationalized/date позволяет работать с
различными календарями:
Пример:
import {JapaneseCalendar} from "@internationalized/date";
Это позволяет создавать международные интерфейсы без изменения логики компонента.
Сегменты можно стилизовать по их типу.
<span
{...segmentProps}
className={`segment-${segment.type}`}
>
{segment.text}
</span>
Пример CSS:
.segment-day {
font-weight: bold;
}
.segment-month {
color: blue;
}
Если значение сегмента отсутствует, отображается placeholder.
Примеры:
DD/MM/YYYY
MM-DD-YYYY
Это обеспечивает:
useDateField поддерживает и временные сегменты.
Пример формата:
12/05/2026 14:30
Добавляются дополнительные типы сегментов:
Изменение одного сегмента может влиять на другие.
Пример:
31 февраля → автоматически корректируется
Система:
useDateField автоматически добавляет необходимые
атрибуты:
role="group"aria-labelledbyaria-describedbyaria-invalidЭто обеспечивает поддержку:
Несмотря на сложную внутреннюю логику, useDateField
оптимизирован:
Каждый сегмент обновляется только при необходимости.
Полный компонент обычно включает:
DateField
├─ Label
├─ Segments
├─ Validation message
└─ Description
Пример структуры JSX:
<label>Date</label>
<DateField />
<p>Select a date</p>
useDateField поддерживает:
DatePickerЭто делает его базовым инструментом для создания сложных компонентов работы с датами в экосистеме React Aria.