React Aria предоставляет набор хуков для управления доступностью интерфейсов в React. Эти хуки упрощают работу с ARIA-атрибутами, фокусом, клавиатурной навигацией и другими аспектами доступности.
useButtonХук useButton используется для создания кнопок с
поддержкой клавиатуры и ARIA-атрибутов.
Сигнатура:
const { buttonProps, isPressed } = useButton(props, ref);
Параметры:
props – объект с атрибутами кнопки
(onPress, isDisabled, elementType
и др.)ref – ссылка на DOM-элемент кнопкиВозвращаемые значения:
buttonProps – набор атрибутов, которые нужно передать
на элементisPressed – логическое состояние, указывающее на то,
что кнопка нажатаПример использования:
function MyButton(props) {
let ref = useRef();
let { buttonProps, isPressed } = useButton(props, ref);
return <button {...buttonProps} ref={ref}>{isPressed ? "Нажато" : "Нажми меня"}</button>;
}
useCheckboxХук для управления состоянием флажков с поддержкой ARIA.
Сигнатура:
const { inputProps } = useCheckbox(props, state);
Параметры:
props – объект с атрибутами чекбокса
(isSelected, isDisabled,
onChange)state – состояние чекбокса, создаваемое через
useToggleStateВозвращаемые значения:
inputProps – атрибуты, которые нужно передать на
<input type="checkbox">Пример использования:
function CheckboxExample() {
let state = useToggleState();
let ref = useRef();
let { inputProps } = useCheckbox({ isSelected: state.isSelected, onChange: state.setSelected }, ref);
return <input {...inputProps} ref={ref} />;
}
useFocusRingХук для управления фокусом и отображением фокусного кольца.
Сигнатура:
const { isFocusVisible, focusProps } = useFocusRing();
Возвращаемые значения:
isFocusVisible – boolean, указывающий, нужно ли
показывать визуальный индикатор фокусаfocusProps – свойства для передачи на элемент для
управления фокусомПример использования:
function FocusableInput() {
let { isFocusVisible, focusProps } = useFocusRing();
return <input {...focusProps} style={{ outline: isFocusVisible ? '2px solid blue' : 'none' }} />;
}
useMenu и
useMenuItemХуки для создания меню и элементов меню с поддержкой клавиатурной навигации и ARIA.
Пример использования useMenu:
let state = useMenuState();
let ref = useRef();
let { menuProps } = useMenu({ autoFocus: true }, state, ref);
return (
<ul {...menuProps} ref={ref}>
{items.map(item => <MenuItem key={item.key} item={item} state={state} />)}
</ul>
);
Пример использования useMenuItem:
function MenuItem({ item, state }) {
let ref = useRef();
let { menuItemProps, isFocused, isSelected } = useMenuItem({ key: item.key }, state, ref);
return (
<li {...menuItemProps} ref={ref} style={{ background: isFocused ? 'lightgray' : 'transparent' }}>
{item.name}
</li>
);
}
useSelectХук для создания селектов с поддержкой клавиатурной навигации и ARIA.
Сигнатура:
const { labelProps, triggerProps, valueProps, menuProps } = useSelect(props, state, ref);
Особенности:
useListState для управления состоянием
элементовПример использования:
let state = useListState({ items });
let ref = useRef();
let { labelProps, triggerProps, valueProps, menuProps } = useSelect({ label: 'Выберите элемент' }, state, ref);
return (
<div>
<label {...labelProps}>Выберите элемент</label>
<button {...triggerProps} ref={ref}>{state.selectedItem?.name || 'Выберите...'}</button>
{state.isOpen && <ul {...menuProps}>{state.collection.map(item => <li key={item.key}>{item.rendered}</li>)}</ul>}
</div>
);
useSliderХук для управления слайдерами с поддержкой ARIA и клавиатуры.
Основные свойства:
minValue, maxValue – диапазон
значенийvalue, onChange – текущее значение и
обработчик измененияorientation – вертикальная или горизонтальная
ориентацияПример использования:
let state = useSliderState({ minValue: 0, maxValue: 100, value: 50 });
let ref = useRef();
let { trackProps, thumbProps } = useSlider({ orientation: 'horizontal' }, state, ref);
return (
<div {...trackProps} ref={ref} style={{ width: '200px', height: '4px', background: 'gray' }}>
<div {...thumbProps} style={{ left: `${state.value}%`, width: '16px', height: '16px', background: 'blue', position: 'absolute' }} />
</div>
);
useToggleState и
useListStateЭти хуки обеспечивают управление состоянием для интерактивных компонентов:
useToggleState – для переключателей, чекбоксов, кнопок
включения/выключенияuseListState – для списков и коллекций с выбором
элементовПример использования
useToggleState:
let toggle = useToggleState({ defaultSelected: false });
toggle.setSelected(!toggle.isSelected);
Пример использования useListState:
let state = useListState({ items });
state.selectedKeys.add('item1');
useFocus и
useHoveruseFocus – управляет событиями фокуса и bluruseHover – управляет состоянием наведения мыши, полезно
для всплывающих подсказок и интерактивных элементовПример useHover:
let { hoverProps, isHovered } = useHover({});
return <div {...hoverProps} style={{ background: isHovered ? 'lightblue' : 'white' }}>Наведи на меня</div>;
useDialogХук для создания модальных диалогов с поддержкой ARIA и управления фокусом.
Пример использования:
let ref = useRef();
let { dialogProps, titleProps } = useDialog({}, ref);
return (
<div {...dialogProps} ref={ref} role="dialog" aria-modal="true">
<h2 {...titleProps}>Заголовок диалога</h2>
<p>Содержимое диалога</p>
</div>
);
useTooltipХук для создания подсказок с управлением ARIA и позицией.
Пример использования:
let { tooltipProps, triggerProps } = useTooltip({ description: 'Это подсказка' });
return (
<div>
<button {...triggerProps}>Наведи на меня</button>
<div {...tooltipProps}>Это подсказка</div>
</div>
);
Эти хуки формируют базовый каркас React Aria и обеспечивают полную интеграцию с ARIA, клавиатурной навигацией, фокусом и состоянием компонентов. Их правильное применение позволяет создавать доступные интерфейсы без прямой ручной работы с атрибутами ARIA.