ARIA (Accessible Rich Internet Applications) — это набор атрибутов, предназначенных для повышения доступности веб-приложений. В React Aria библиотека предоставляет набор утилит и хуков, которые автоматически управляют ARIA-атрибутами и событиями для различных компонентов, таких как кнопки, меню, списки, табы и формы. Основная цель — сделать компоненты доступными без необходимости вручную писать сложные ARIA-атрибуты.
Ключевые моменты:
button, menu, tab).aria-expanded, aria-selected,
aria-label).Хук useButton используется для кнопок и интерактивных
элементов, которые ведут себя как кнопки.
import {useButton} from '@react-aria/button';
import {useRef} from 'react';
function MyButton(props) {
const ref = useRef();
const {buttonProps} = useButton(props, ref);
return <button {...buttonProps} ref={ref}>{props.children}</button>;
}
Особенности:
role="button", если элемент не
<button>.disabled.Enter, Space).useCheckbox упрощает работу с чекбоксами, синхронизируя
состояние с ARIA-атрибутами.
import {useCheckbox} from '@react-aria/checkbox';
import {useRef, useState} from 'react';
function MyCheckbox() {
const [isSelected, setSelected] = useState(false);
const ref = useRef();
const {inputProps} = useCheckbox(
{isSelected, onChange: setSelected},
ref
);
return <input {...inputProps} ref={ref} />;
}
Особенности:
aria-checked.aria-checked="mixed").Space.Для создания доступных меню используется комбинация
useMenu и useMenuItem.
import {useMenu, useMenuItem} from '@react-aria/menu';
import {useRef} from 'react';
function DropdownMenu({items}) {
const ref = useRef();
const {menuProps} = useMenu({}, ref);
return (
<ul {...menuProps} ref={ref}>
{items.map(item => <MenuItem key={item.key} item={item} />)}
</ul>
);
}
function MenuItem({item}) {
const ref = useRef();
const {menuItemProps} = useMenuItem({key: item.key}, {}, ref);
return <li {...menuItemProps} ref={ref}>{item.name}</li>;
}
Особенности:
role="menu" и role="menuitem" добавляются
автоматически.ArrowUp,
ArrowDown, Enter).React Aria предоставляет низкоуровневые утилиты для работы с ARIA-атрибутами, которые можно комбинировать с кастомными компонентами:
import {mergeProps} from '@react-aria/utils';
const props = mergeProps(buttonProps, customProps);
import {filterDOMProps} from '@react-aria/utils';
const cleanProps = filterDOMProps(props);
aria-labelledby,
aria-controls).import {useId} from '@react-aria/utils';
const id = useId();
<input id={id} aria-labelledby={`${id}-label`} />
В React Aria ARIA-атрибуты тесно связаны с состоянием компонентов. Например:
aria-expanded меняется в зависимости от того, открыто
ли меню или аккордеон.aria-checked синхронизируется с состоянием чекбокса или
радио-кнопки.aria-selected отражает выбор элемента в списке, вкладке
или таблице.Использование хуков React Aria позволяет абстрагировать логику состояния, избавляя от ручного управления всеми атрибутами и событиями. Это снижает вероятность ошибок и обеспечивает единый стандарт доступности.
React Aria позволяет создавать полностью кастомные компоненты, сохраняя доступность. Принципы:
{...buttonProps}).ref обязательно для корректного
управления фокусом.Пример кастомной кнопки с иконкой:
function IconButton({icon, ...props}) {
const ref = useRef();
const {buttonProps} = useButton(props, ref);
return (
<button {...buttonProps} ref={ref}>
{icon}
</button>
);
}
mergeProps,
filterDOMProps, useId) позволяют строить
гибкие кастомные компоненты.Эти подходы формируют основу для построения доступных и гибких интерфейсов, полностью соответствующих современным стандартам ARIA и WCAG.