Хук useCalendarCell предназначен для управления
состоянием и поведением отдельной ячейки календаря в компонентах,
построенных с помощью библиотеки React Aria. Он позволяет корректно
обрабатывать фокус, выбор даты, доступность и взаимодействие с
клавиатурой, соответствуя стандартам доступности (ARIA).
Управление фокусом и выделением
useCalendarCell предоставляет свойства для корректной
работы с фокусом и выделением текущей даты. Это особенно важно для
пользователей, которые используют клавиатуру или вспомогательные
технологии.
Поддержка доступности (ARIA) Хук генерирует
атрибуты role, aria-selected,
aria-disabled, которые необходимы для соответствия
стандартам WAI-ARIA. Это позволяет экранным читалкам корректно
интерпретировать календарь.
Интеграция с состоянием календаря Хук использует контекст календаря, получая текущий месяц, выбранную дату и минимальные/максимальные значения. Это обеспечивает правильное поведение при навигации и выборе дат.
import { useCalendarCell } from '@react-aria/calendar';
import { useLocale } from '@react-aria/i18n';
import { useCalendarState } from '@react-stately/calendar';
import { useRef } from 'react';
function CalendarCell({ date, state }) {
const ref = useRef();
const { cellProps, buttonProps, isSelected, isDisabled, formattedDate } = useCalendarCell(
{ date },
state,
ref
);
return (
<td {...cellProps}>
<button {...buttonProps} ref={ref} disabled={isDisabled}>
{formattedDate}
</button>
</td>
);
}
Ключевые моменты кода:
date — объект типа DateValue из
@react-stately/calendar, представляющий конкретную
дату.state — объект состояния календаря, получаемый через
useCalendarState, который хранит выбранную дату, фокус и
настройки календаря.ref — ссылка на DOM-элемент кнопки для корректной
работы фокуса.cellProps — свойства для контейнера ячейки
(td), включая ARIA-атрибуты.buttonProps — свойства для интерактивного элемента,
обрабатывающего выбор даты.isSelected — логическое значение, показывающее,
выделена ли текущая дата.isDisabled — логическое значение, показывающее,
доступна ли дата для выбора.formattedDate — локализованная строка даты для
отображения.Состояние календаря создается с помощью
useCalendarState, которое управляет выделением и фокусом на
уровне всей сетки календаря:
import { useCalendarState } from '@react-stately/calendar';
const state = useCalendarState({
visibleDuration: { months: 1 },
minValue: new Date(2023, 0, 1),
maxValue: new Date(2024, 11, 31),
locale: 'ru-RU',
selectionMode: 'single'
});
Параметры:
visibleDuration — период отображения календаря (месяц,
год).minValue и maxValue — ограничения на выбор
даты.locale — локализация для форматирования дат.selectionMode — режим выбора (single,
multiple, range).useCalendarCell автоматически обрабатывает навигацию с
клавиатуры:
Хук позволяет динамически контролировать доступность ячеек:
const isDisabled = state.isDateUnavailable(date);
const isSelected = state.isSelected(date);
isDisabled возвращает true, если дата
выходит за пределы minValue/maxValue или
заблокирована другими условиями.isSelected проверяет, выбрана ли дата в текущем
состоянии календаря.Для корректного отображения дат используется
useLocale:
import { useLocale } from '@react-aria/i18n';
const { locale, timeZone } = useLocale();
const formattedDate = state.formatDate(date, { weekday: 'short', day: 'numeric' });
Это позволяет отображать даты в нужном формате, учитывая локаль пользователя и часовой пояс.
React.memo для ячеек —
предотвращает лишние ререндеры при изменении состояния других
ячеек.isDisabled и isSelected
на уровне состояния — снижает нагрузку на DOM.<table> — совместимость с экранными
читалками.useCalendarCell можно интегрировать с любыми визуальными
компонентами кнопок или ячеек, сохраняя доступность:
<MyCustomButton {...buttonProps} ref={ref} disabled={isDisabled}>
{formattedDate}
</MyCustomButton>
Важно, чтобы кастомный компонент поддерживал передачу
ref и корректно обрабатывал disabled.
useCalendarCell обеспечивает:
Его использование является стандартом для создания доступных и функциональных календарей в React-приложениях.