React Aria — это библиотека, предоставляющая низкоуровневые хуки для управления доступностью интерфейсов на уровне компонентов. Она не накладывает стили и не предоставляет визуальные элементы, концентрируясь исключительно на поведении и семантике. Основная цель библиотеки — облегчить создание доступных компонентов, соответствующих стандартам ARIA, без необходимости вручную писать сложные обработчики событий и атрибуты.
Каждый компонент интерфейса должен иметь правильную семантическую разметку. React Aria предоставляет хуки для автоматического добавления ARIA-атрибутов в зависимости от состояния компонента. Например:
aria-checked и состоянием выбора.Пример использования useButton:
import {useButton} from '@react-aria/button';
import {useRef} from 'react';
function AccessibleButton(props) {
const ref = useRef();
const {buttonProps} = useButton(props, ref);
return <button {...buttonProps} ref={ref}>{props.children}</button>;
}
Здесь библиотека автоматически добавляет обработку событий клавиатуры
(Enter, Space) и корректно управляет
фокусом.
React Aria предоставляет мощные инструменты для управления фокусом, включая хуки:
Пример работы с фокусом:
import {useFocusRing} from '@react-aria/focus';
import {useRef} from 'react';
function FocusableInput() {
const ref = useRef();
const {isFocusVisible, focusProps} = useFocusRing();
return (
<input
{...focusProps}
ref={ref}
style={{outline: isFocusVisible ? '2px solid blue' : 'none'}}
/>
);
}
Этот подход гарантирует, что фокус будет корректно отображаться для пользователей с клавиатурной навигацией и экранными читалками.
Для сложных интерфейсов React Aria предлагает хуки состояния, отделяющие логику от представления:
Пример с переключателем:
import {useToggleState} from '@react-stately/toggle';
import {useSwitch} from '@react-aria/switch';
import {useRef} from 'react';
function AccessibleSwitch(props) {
const state = useToggleState(props);
const ref = useRef();
const {inputProps} = useSwitch(props, state, ref);
return <input {...inputProps} ref={ref} />;
}
Библиотека автоматически синхронизирует ARIA-атрибуты и состояние переключателя с визуальной частью.
Модальные окна требуют особого внимания к фокусу и семантике. React Aria предлагает useModal и useOverlay для управления фокусом и скрытием контента за модальным окном. Основные принципы:
Пример модального окна:
import {useOverlay, useModal} from '@react-aria/overlays';
import {useRef} from 'react';
function Modal({isOpen, onClose, children}) {
const ref = useRef();
const {modalProps} = useModal();
const {overlayProps} = useOverlay({isOpen, onClose, isDismissable: true}, ref);
if (!isOpen) return null;
return (
<div {...overlayProps} {...modalProps} ref={ref}>
{children}
</div>
);
}
React Aria упрощает создание доступных форм через хуки для каждого типа элемента:
aria-invalid,
aria-describedby.Пример текстового поля с валидацией:
import {useTextField} from '@react-aria/textfield';
import {useRef} from 'react';
function AccessibleInput({label, validationState}) {
const ref = useRef();
const {labelProps, inputProps, descriptionProps, errorMessageProps} = useTextField({
label,
validationState
}, ref);
return (
<div>
<label {...labelProps}>{label}</label>
<input {...inputProps} ref={ref} />
{validationState === 'invalid' && <span {...errorMessageProps}>Ошибка ввода</span>}
</div>
);
}
React Aria предоставляет хуки для сложных списков, таблиц и деревьев:
Использование этих хуков гарантирует правильную работу с экранными читалками и соблюдение стандартов доступности.
React Aria разделяет ответственность между:
Такой подход позволяет создавать масштабируемые, доступные и легко поддерживаемые интерфейсы, соблюдая стандарты веб-доступности.