Мультимодальность взаимодействий в интерфейсе подразумевает поддержку разных способов ввода и взаимодействия с компонентами: клавиатура, мышь, сенсорные экраны, голосовые команды и ассистивные технологии. Библиотека React Aria предоставляет мощный набор хуков и утилит, обеспечивающих доступность компонентов вне зависимости от способа взаимодействия пользователя.
useFocusRing – отслеживание состояния
фокуса и визуальных индикаторов для разных модальностей. Позволяет
отделять фокус, вызванный клавиатурой, от фокуса, вызванного мышью.
Пример использования:
import {useFocusRing} from '@react-aria/focus';
function Button(props) {
let {isFocusVisible, focusProps} = useFocusRing();
return (
<button {...focusProps} className={isFocusVisible ? 'focus-ring' : ''}>
{props.children}
</button>
);
}
Ключевой момент: визуальное выделение фокуса появляется только при навигации с клавиатуры, предотвращая лишние визуальные шумы при использовании мыши.
useHover – обработка наведения курсора
или сенсорного взаимодействия. Поддерживает как мышь, так и сенсорный
ввод:
import {useHover} from '@react-aria/interactions';
function HoverCard(props) {
let {hoverProps, isHovered} = useHover({});
return (
<div {...hoverProps} className={isHovered ? 'hovered' : ''}>
{props.children}
</div>
);
}
Особенность: сенсорные устройства автоматически не вызывают состояние
hover, что позволяет избежать некорректного поведения на
мобильных.
useKeyboard позволяет реагировать на
клавишные события, не нарушая стандартной семантики компонентов.
Пример:
import {useKeyboard} from '@react-aria/interactions';
function ShortcutButton(props) {
let {keyboardProps} = useKeyboard({
onKeyDown: (e) => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
props.onActivate();
}
}
});
return <button {...keyboardProps}>{props.children}</button>;
}
Особенность: интеграция с другими хуками React Aria,
такими как usePress и useFocusRing, позволяет
синхронизировать визуальную обратную связь с событиями клавиатуры.
usePress для мультимодальных кликовХук usePress объединяет обработку
нажатий мышью, касаний и клавиатуры. Он автоматически учитывает разные
устройства ввода, предоставляя унифицированный интерфейс:
import {usePress} from '@react-aria/interactions';
function PressableButton(props) {
let {pressProps, isPressed} = usePress({
onPress: props.onPress
});
return (
<button {...pressProps} className={isPressed ? 'pressed' : ''}>
{props.children}
</button>
);
}
Важно: isPressed обновляется для любого
способа активации кнопки, что упрощает создание отзывчивых интерактивных
компонентов.
React Aria предоставляет хуки
useListBox,
useMenu и
useMenuItem, которые поддерживают:
Пример использования useMenu:
import {useMenu, useMenuItem} from '@react-aria/menu';
import {useListState} from '@react-stately/list';
function DropdownMenu({items}) {
let state = useListState({items});
let ref = React.useRef();
let {menuProps} = useMenu({onAction: state.setSelectedKey}, state, ref);
return (
<ul {...menuProps} ref={ref}>
{state.collection.map(item => (
<MenuItem key={item.key} item={item} />
))}
</ul>
);
}
function MenuItem({item}) {
let ref = React.useRef();
let {menuItemProps, isFocused, isSelected} = useMenuItem(
{key: item.key},
null,
ref
);
return (
<li
{...menuItemProps}
ref={ref}
className={`${isFocused ? 'focused' : ''} ${isSelected ? 'selected' : ''}`}
>
{item.rendered}
</li>
);
}
Особенность: все события и состояния (фокус, выделение) обрабатываются независимо от способа взаимодействия, что обеспечивает полноценную мультимодальность.
React Aria позволяет комбинировать хуки мультимодальности с внешними
библиотеками для поддержки сенсорных жестов и голосовых команд.
Например, можно обернуть usePress в обработчики жестов
свайпа или голосовой активации, не меняя основную логику компонента. Это
делает архитектуру интерфейса модульной и расширяемой.
isFocusVisible), нажатие (isPressed) и
наведение (isHovered) управляются отдельно.useListState и useTreeState
позволяет синхронизировать состояние элементов с различными способами
ввода.usePress, useHover,
useFocusRing и useKeyboard для создания
отзывчивых и универсальных интерактивных элементов.Мультимодальность в React Aria позволяет создавать компоненты, одинаково удобные и безопасные для пользователей с любыми способами взаимодействия, обеспечивая единый API для обработки событий и состояний независимо от устройства ввода.