React Aria — это библиотека, предоставляющая набор хуков для управления доступностью (accessibility, a11y) в компонентах React. Она не поставляет визуальные компоненты, а фокусируется на логике взаимодействия, событиях и атрибутах ARIA. Использование React Aria позволяет создавать интерфейсы, соответствующие стандартам WCAG и полностью управляемые клавиатурой и вспомогательными технологиями.
Для начала необходимо установить пакет:
npm install @react-aria/utils @react-aria/button @react-aria/listbox @react-aria/overlays
Важно отметить, что React Aria ориентирован на React 18 и выше. После установки подключение хуков выглядит так:
import {useButton} from '@react-aria/button';
import {useListBox, useOption} from '@react-aria/listbox';
import {useOverlay} from '@react-aria/overlays';
Каждый хук возвращает набор пропсов, которые необходимо передавать в соответствующие элементы DOM для обеспечения корректной доступности.
Хук useButton управляет поведением кнопки, включая
обработку нажатий, фокус и клавиатурные события. Пример:
import React, {useRef} from 'react';
import {useButton} from '@react-aria/button';
function AccessibleButton({onPress, children}) {
let ref = useRef();
let {buttonProps} = useButton({onPress}, ref);
return (
<button {...buttonProps} ref={ref}>
{children}
</button>
);
}
Ключевые моменты:
ref обязателен для корректной работы хуков.buttonProps содержит атрибуты ARIA, обработчики событий
onClick, onKeyDown и
onKeyUp.Для создания доступного списка с выбором элементов используется
комбинация useListBox и useOption. Пример:
import {useListBox, useOption} from '@react-aria/listbox';
import {useListState} from '@react-stately/list';
function ListBox({items, onSelectionChange}) {
let state = useListState({items, onSelectionChange});
let ref = React.useRef();
let {listBoxProps} = useListBox({}, state, ref);
return (
<ul {...listBoxProps} ref={ref}>
{state.collection.map(item => (
<Option key={item.key} item={item} state={state} />
))}
</ul>
);
}
function Option({item, state}) {
let ref = React.useRef();
let {optionProps, isSelected, isFocused} = useOption({key: item.key}, state, ref);
return (
<li
{...optionProps}
ref={ref}
style={{
background: isFocused ? 'lightblue' : 'transparent',
fontWeight: isSelected ? 'bold' : 'normal'
}}
>
{item.rendered}
</li>
);
}
Важные аспекты:
useListState управляет внутренним состоянием выбора и
фокуса.optionProps автоматически добавляет ARIA-атрибуты
aria-selected, role="option" и обработчики
клавиатуры.React Aria предоставляет хуки для управления оверлеями и модальными окнами с учетом доступности:
import {useOverlay, usePreventScroll} from '@react-aria/overlays';
function Modal({isOpen, onClose, children}) {
let ref = React.useRef();
let {overlayProps} = useOverlay({onClose, isOpen, isDismissable: true}, ref);
usePreventScroll();
if (!isOpen) return null;
return (
<div {...overlayProps} ref={ref} style={{position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, background: 'rgba(0,0,0,0.5)'}}>
<div style={{background: 'white', margin: 'auto', padding: 20}}>
{children}
</div>
</div>
);
}
Особенности:
useOverlay обрабатывает закрытие по Escape и клику вне
модального окна.usePreventScroll блокирует прокрутку фона при открытой
модалке.React Aria строится на принципе «логика отделена от визуальной реализации». Это позволяет внедрять библиотеку поэтапно:
useListState или
аналогичных структурах для сложных компонентов.Поэтапное внедрение React Aria позволяет минимизировать риск регресса и постепенно улучшать доступность приложения без глобальной переработки интерфейса.