ARIA (Accessible Rich Internet Applications) — это набор атрибутов, предназначенных для улучшения доступности веб-приложений. В библиотеке React Aria они интегрированы на уровне компонентов, что позволяет автоматически добавлять правильные роли, состояния и свойства для поддержки экранных читалок и других вспомогательных технологий.
Ключевые моменты работы с ARIA:
role) описывают назначение
элемента (например, button, checkbox,
tab).aria-checked,
aria-expanded) отражают текущее состояние
элемента.aria-labelledby,
aria-describedby) связывают элементы с текстовыми
метками или описаниями.React Aria обеспечивает правильное использование этих атрибутов через хуки, которые автоматически управляют ARIA-логикой.
React Aria предоставляет набор хуков, которые позволяют создавать доступные компоненты без ручного выставления всех атрибутов.
useButtonimport { 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>;
}
role="button",
aria-pressed при необходимости и обрабатывает клавиатурные
события.useCheckboximport { useCheckbox } from '@react-aria/checkbox';
import { useRef } from 'react';
function MyCheckbox(props) {
let ref = useRef();
let { inputProps } = useCheckbox(props, ref);
return <input type="checkbox" {...inputProps} ref={ref} />;
}
aria-checked.indeterminate и синхронизирует его
с визуальным отображением.useMenu и
useMenuItemЭти хуки позволяют строить доступные выпадающие меню с правильной навигацией и ARIA-атрибутами.
import { useMenu, useMenuItem } from '@react-aria/menu';
import { useRef } from 'react';
function MenuItem({ item }) {
let ref = useRef();
let { menuItemProps } = useMenuItem({ key: item.key }, null, ref);
return <li {...menuItemProps} ref={ref}>{item.name}</li>;
}
role="menuitem" и правильная обработка фокуса для
клавиатуры.aria-disabled для недоступных элементов.При работе с React Aria важно убедиться, что компоненты используют атрибуты правильно.
Автоматическая проверка через DevTools:
role="button", для чекбокса —
aria-checked.Использование линтеров и тестов доступности:
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
test('checkbox toggles aria-checked', async () => {
render(<MyCheckbox />);
let checkbox = screen.getByRole('checkbox');
expect(checkbox).toHaveAttribute('aria-checked', 'false');
await userEvent.click(checkbox);
expect(checkbox).toHaveAttribute('aria-checked', 'true');
});
Инструменты проверки доступности:
useButton, не нужно вручную ставить
role="button". Дублирование может нарушить
доступность.aria-checked, aria-expanded), а не только
визуально.aria-label или aria-labelledby для элементов,
у которых нет видимого текста.Для компонентов, изменяющихся в зависимости от состояния (например, выпадающие списки, вкладки):
useTabList, useTab,
useDisclosure для автоматического управления
aria-selected, aria-controls и
aria-expanded.import { useTab, useTabList } from '@react-aria/tabs';
import { useRef } from 'react';
function MyTab({ tab, selectedKey }) {
let ref = useRef();
let { tabProps } = useTab({ key: tab.key }, { selectedKey }, ref);
return <div {...tabProps} ref={ref}>{tab.name}</div>;
}
aria-selected и
aria-controls.React Aria делает работу с ARIA прозрачной и надежной, но контроль через инспекторы, тесты и линтеры остаётся критически важным для обеспечения полной доступности интерфейса.