React Aria — это библиотека, ориентированная на создание доступных пользовательских интерфейсов в React. Она предоставляет набор хуков и утилит для корректной работы компонентов с скринридерами, клавиатурной навигацией и другими вспомогательными технологиями. Центральная цель — обеспечить совместимость компонентов с ARIA-атрибутами, не переписывая вручную сложную логику управления фокусом и взаимодействием.
В React Aria большинство хуков автоматически управляет
ARIA-атрибутами. Например, использование хука useButton
гарантирует, что элемент будет правильно восприниматься как кнопка,
включая состояния disabled, pressed и
focus.
import {useButton} from '@react-aria/button';
import {useRef} from 'react';
function MyButton(props) {
let ref = useRef();
let {buttonProps} = useButton(props, ref);
return <button {...buttonProps} ref={ref}>{props.children}</button>;
}
Ключевые моменты:
useButton автоматически добавляет
role="button" и соответствующие обработчики событий.aria-disabled, aria-pressed
обновляются в зависимости от пропсов.Для компонентов, которые требуют сложной навигации (например,
таблицы, списки, выпадающие меню), важно корректно
управлять фокусом. React Aria предоставляет хуки вроде
useFocusRing, useFocusManager и
useKeyboard.
import {useFocusRing} from '@react-aria/focus';
import {useRef} from 'react';
function FocusableInput() {
let ref = useRef();
let {focusProps, isFocusVisible} = useFocusRing();
return (
<input {...focusProps} ref={ref} className={isFocusVisible ? 'focus-visible' : ''} />
);
}
Особенности:
useFocusRing позволяет отслеживать, когда фокус
визуально виден, чтобы корректно отображать обводку для клавиатурной
навигации.useFocusManager упрощает переход между элементами с
помощью клавиатуры, особенно в сложных компонентах типа меню или
таблиц.Для доступных выпадающих меню, селектов и списков React Aria
использует хук useListBox и useMenu. Они
гарантируют, что скринридеры смогут корректно озвучивать выбранные
элементы и их состояния.
import {useListBox, useOption} from '@react-aria/listbox';
import {useRef} from 'react';
function ListItem({item, state}) {
let ref = useRef();
let {optionProps, isSelected, isDisabled} = useOption({key: item.key}, state, ref);
return (
<li {...optionProps} ref={ref} aria-disabled={isDisabled}>
{item.name} {isSelected ? '(выбрано)' : ''}
</li>
);
}
Принципы работы:
useOption управляет ARIA-состояниями:
aria-selected, aria-disabled.React Aria предоставляет хуки для управления полями ввода, чекбоксами и радиокнопками, интегрируя ARIA-атрибуты для форм.
import {useCheckbox} from '@react-aria/checkbox';
import {useRef} from 'react';
function MyCheckbox(props) {
let ref = useRef();
let {inputProps} = useCheckbox(props, ref);
return <input {...inputProps} ref={ref} />;
}
Важно:
useCheckbox добавляет role="checkbox" и
поддерживает aria-checked.Для динамических уведомлений, которые должны быть озвучены
скринридером, React Aria предлагает useLiveAnnouncer. Он
позволяет объявлять важные события пользователю без визуального
вмешательства.
import {useLiveAnnouncer} from '@react-aria/live-announcer';
function Notification({message}) {
let announcer = useLiveAnnouncer();
React.useEffect(() => {
announcer.announce(message, 'polite');
}, [message]);
return null;
}
Особенности:
announce принимает сообщение и тип озвучивания
(polite или assertive).Эти принципы лежат в основе всех хуков React Aria, обеспечивая корректное взаимодействие компонентов с пользователями, использующими скринридеры и другие вспомогательные технологии.