Библиотека React Aria предоставляет мощный набор хуков для управления поведением компонентов пользовательского интерфейса с учётом доступности. Хуки поведения отвечают за логику взаимодействия, событий и состояния компонентов, позволяя отделить визуальное представление от функциональности. Они построены на принципах контролируемых и неконтролируемых компонентов, а также состояний фокуса, выделения и клавиатурной навигации.
Хук useButton предназначен для управления поведением
кнопки. Он обеспечивает корректную обработку событий клика, клавиатурных
взаимодействий и атрибутов доступности.
Пример использования:
import { useButton } from '@react-aria/button';
import { useRef } from 'react';
function Button(props) {
let ref = useRef();
let { buttonProps } = useButton(props, ref);
return <button {...buttonProps} ref={ref}>{props.children}</button>;
}
Ключевые моменты useButton:
aria-disabled при
isDisabled.onPress, onPressStart,
onPressEnd для разных стадий взаимодействия.Хук useCheckbox управляет состоянием флажка
(checkbox) с учётом доступности. Позволяет работать как с
контролируемым, так и с неконтролируемым состоянием.
import { useCheckbox } from '@react-aria/checkbox';
import { useRef, useState } from 'react';
function Checkbox(props) {
let ref = useRef();
let [isSelected, setSelected] = useState(false);
let { inputProps } = useCheckbox({ ...props, isSelected, onChange: setSelected }, ref);
return <input {...inputProps} ref={ref} />;
}
Особенности:
aria-checked.Хук useFocus позволяет отслеживать и управлять
состоянием фокуса. Особенно полезен для кастомных элементов, где
стандартный <input> не используется.
import { useFocus } from '@react-aria/focus';
import { useRef } from 'react';
function FocusableDiv() {
let ref = useRef();
let { focusProps, isFocused } = useFocus();
return (
<div {...focusProps} ref={ref} style={{ outline: isFocused ? '2px solid blue' : 'none' }}>
Нажми Tab, чтобы сфокусироваться
</div>
);
}
Особенности useFocus:
isFocused для визуальных
индикаторов.onFocus и onBlur
через объединение с пользовательскими обработчиками.Хук useHover контролирует поведение при наведении мыши и
учитывает мобильные устройства, где наведение отсутствует.
import { useHover } from '@react-aria/interactions';
import { useRef } from 'react';
function HoverableDiv() {
let ref = useRef();
let { hoverProps, isHovered } = useHover({});
return (
<div {...hoverProps} ref={ref} style={{ background: isHovered ? 'lightgray' : 'white' }}>
Наведи курсор сюда
</div>
);
}
Ключевые возможности:
isHovered для визуальных эффектов.Для создания доступных меню используются хуки useMenu и
useMenuItem. useMenu управляет списком
элементов, а useMenuItem — отдельным элементом меню.
Пример использования:
import { useMenu, useMenuItem } from '@react-aria/menu';
import { useRef } from 'react';
function Menu({ items }) {
let ref = useRef();
let { menuProps } = useMenu({ items }, ref);
return (
<ul {...menuProps} ref={ref}>
{items.map(item => <MenuItem key={item.key} item={item} />)}
</ul>
);
}
function MenuItem({ item }) {
let ref = useRef();
let { menuItemProps, isFocused, isSelected } = useMenuItem({ key: item.key }, ref);
return (
<li {...menuItemProps} ref={ref} style={{ background: isFocused ? 'lightblue' : 'white' }}>
{item.name} {isSelected && '✔'}
</li>
);
}
Особенности:
Home/End.role="menu",
role="menuitem", aria-selected.Хук useSlider реализует поведение ползунков с учётом
доступности и сенсорных интерфейсов.
min,
max, step.sliderProps для контейнера и
thumbProps для ручки ползунка.import { useSlider } from '@react-aria/slider';
import { useRef, useState } from 'react';
function SliderComponent() {
let ref = useRef();
let [value, setValue] = useState(50);
let { sliderProps, trackProps, thumbProps } = useSlider({ minValue: 0, maxValue: 100, value, onChange: setValue }, ref);
return (
<div {...sliderProps} ref={ref}>
<div {...trackProps}>
<div {...thumbProps} />
</div>
<span>{value}</span>
</div>
);
}
React Aria позволяет комбинировать хуки поведения для создания
сложных компонентов. Например, useFocus и
useHover можно объединить для кнопок с кастомным визуальным
состоянием:
let { focusProps, isFocused } = useFocus();
let { hoverProps, isHovered } = useHover();
let combinedProps = { ...focusProps, ...hoverProps };
...) и проверять
корректность передачи ref.Хуки поведения React Aria являются фундаментом для построения доступных и предсказуемых компонентов интерфейса, позволяя сосредоточиться на визуальной части без потери контроля над состояниями и взаимодействиями.