React Aria — библиотека, предназначенная для создания доступных пользовательских интерфейсов, предоставляет готовые хуки и утилиты для управления состоянием, фокусом, клавиатурной навигацией и ARIA-атрибутами. В основе разработки с React Aria лежат определённые паттерны проектирования, которые обеспечивают модульность, переиспользуемость компонентов и соответствие стандартам доступности.
Одним из ключевых паттернов является разделение компонентов на контролируемые и неконтролируемые:
useCheckbox может принимать
isSelected и onChange, полностью делегируя
управление состоянием родителю.import { useCheckbox } from '@react-aria/checkbox';
import { useToggleState } from '@react-stately/toggle';
function CheckboxExample() {
let state = useToggleState();
let ref = React.useRef();
let { inputProps } = useCheckbox({ isSelected: state.isSelected, onChange: state.toggle }, state, ref);
return <input {...inputProps} ref={ref} />;
}
React Aria придерживается паттерна “state + behavior + presentation”:
useListState, useToggleState,
useSelectState).useButton,
useCheckbox, useMenu).Такое разделение позволяет создавать UI, полностью независимый от логики доступности, при этом соблюдая стандарты ARIA.
Паттерн focus management критически важен для доступности:
useFocusRing позволяет определить, когда элемент
находится в фокусе, и правильно отобразить визуальный индикатор.useFocusManager предоставляет API для программного
перемещения фокуса внутри сложных интерфейсов, таких как модальные окна
и панели навигации.Enter, Space,
Arrow keys).import { useFocusRing } from '@react-aria/focus';
function FocusableButton() {
let { isFocusVisible, focusProps } = useFocusRing();
return <button {...focusProps} style={{ outline: isFocusVisible ? '2px solid blue' : 'none' }}>Click me</button>;
}
React Aria активно использует composition, а не наследование. Вместо создания иерархий классов для добавления функциональности, библиотека предоставляет хуки, которые можно комбинировать:
useOverlay для модальных оконuseDialog для диалоговuseMenu для контекстных менюЭти хуки легко объединяются с любым UI-компонентом, позволяя строить сложные интерфейсы без жёсткой привязки к конкретным классам или структурам.
React Aria обеспечивает автоматическое назначение ARIA-атрибутов в соответствии с состоянием:
aria-checked для чекбоксовaria-selected для списковaria-expanded для раскрывающихся панелейЭто реализуется через паттерн prop getter, где хук возвращает объект с props, который нужно просто распространить на нужный элемент. Такой подход гарантирует корректность доступности без ручного присваивания атрибутов.
let { menuProps } = useMenu({ onAction: item => console.log(item) }, state);
return <ul {...menuProps}>{items.map(item => <li key={item.key}>{item.name}</li>)}</ul>;
Для модальных окон, всплывающих списков и панелей используется Focus Scope, который ограничивает фокус только внутри компонента, предотвращая его уход за пределы:
FocusScope оборачивает содержимое модального окнаcontain блокирует выход фокусаrestoreFocus возвращает фокус на элемент, который был
активен до открытия модального окнаimport { FocusScope } from '@react-aria/focus';
function Modal({ children }) {
return (
<FocusScope contain restoreFocus autoFocus>
{children}
</FocusScope>
);
}
Все компоненты React Aria создаются с паттерном accessibility-first:
Этот паттерн позволяет разработчикам сосредоточиться на визуальной части интерфейса, оставляя всю сложную логику доступности на библиотеку.
Основные паттерны проектирования React Aria:
Эти паттерны обеспечивают надёжную, гибкую и доступную архитектуру компонентов, позволяя создавать масштабируемые интерфейсы без повторной реализации стандартной логики.