React Aria предоставляет набор хуков и утилит для управления доступностью интерфейсов. Одной из ключевых задач при работе с компонентами типа таблиц, сеток, календарей или списков с вложенными элементами является двумерная навигация. Она позволяет пользователю перемещаться по элементам с помощью клавиатуры, обеспечивая полноценный контроль и соответствие стандартам ARIA.
useGrid и useGridCellВ React Aria двумерная структура представляется через сетку
(grid). Хук useGrid отвечает за всю сетку целиком,
а useGridCell — за отдельные ячейки.
Пример использования сетки:
import { useGrid, useGridCell } from '@react-aria/grid';
import { useGridState } from '@react-stately/grid';
import { useFocusRing } from '@react-aria/focus';
function Grid({ items, columns }) {
let state = useGridState({
selectionMode: 'single',
collection: items,
columnCount: columns
});
let { gridProps } = useGrid({}, state);
return (
<div {...gridProps} role="grid">
{state.collection.map((row) => (
<div role="row" key={row.key}>
{row.childNodes.map((cell) => (
<GridCell key={cell.key} cell={cell} state={state} />
))}
</div>
))}
</div>
);
}
function GridCell({ cell, state }) {
let ref = React.useRef();
let { gridCellProps } = useGridCell({ node: cell }, state);
let { isFocusVisible, focusProps } = useFocusRing();
return (
<div
{...gridCellProps}
{...focusProps}
ref={ref}
style={{
outline: isFocusVisible ? '2px solid blue' : 'none',
padding: 8,
border: '1px solid gray'
}}
>
{cell.rendered}
</div>
);
}
Ключевые моменты:
useGrid управляет состоянием сетки и поддерживает
навигацию стрелками.useGridCell обеспечивает правильное управление фокусом
на уровне ячеек.useFocusRing позволяет визуально отображать фокус,
соответствующий стандартам WCAG.useGridStateuseGridState предоставляет состояние сетки, включая
выделение и фокус. Основные параметры:
selectionMode:
'none' | 'single' | 'multiple'.collection: массив данных для отображения.columnCount: количество колонок, используемое для
вычисления позиции фокуса.Состояние управляет логикой перехода между ячейками при нажатии стрелок вверх, вниз, влево и вправо. React Aria автоматически определяет следующую ячейку, учитывая видимые и активные элементы.
React Aria реализует интеллектуальную обработку клавиатуры:
Это позволяет создавать полностью доступные таблицы и сетки без дополнительной ручной логики.
React Aria предоставляет удобные хуки для работы с выделением:
state.selectionManager — управление выбранными
элементами.state.setSelectedKeys(keys) — изменение выделения.Выделение может быть как по ячейкам, так и
по строкам, в зависимости от конфигурации
selectionMode. Для многократного выбора можно использовать
комбинации с Shift и Ctrl, которые React Aria обрабатывает
автоматически.
Для соблюдения стандартов доступности сетки автоматически назначаются ARIA-атрибуты:
role="grid" для контейнера сетки.role="row" для строк.role="gridcell" для ячеек.aria-selected для выбранных элементов.tabIndex для управления фокусом.Это обеспечивает полную совместимость с экранными читалками и поддерживает навигацию клавиатурой без дополнительного кода.
Для больших сеток важно минимизировать ререндеринг:
React.memo для отдельных ячеек.useMemo при изменении
данных.react-virtual или react-virtualized).React Aria позволяет переопределять стандартную логику перемещения
фокуса с помощью опций focusMode и
onAction:
let { gridProps } = useGrid({
onAction: (key) => console.log(`Активирован элемент ${key}`),
focusMode: 'cell' // 'row' или 'cell'
}, state);
Это дает возможность реализовать:
role и aria-* атрибуты
для совместимости с ассистивными технологиями.onKeyDown.Навигация по двумерной структуре в React Aria обеспечивает интуитивное управление, доступность и согласованность поведения, делая таблицы и сетки полностью пригодными для профессиональных веб-приложений.