React Aria предоставляет мощный набор хуков для управления состоянием компонентов с фокусом на доступность (accessibility) и совместимость с ARIA-спецификациями. Хуки состояния позволяют создавать интерактивные элементы интерфейса, такие как кнопки, чекбоксы, переключатели, вкладки и модальные окна, с полностью контролируемым поведением и без необходимости вручную писать сложную логику управления состоянием.
useToggleStateХук useToggleState используется для управления булевым
состоянием компонентов, таких как переключатели и чекбоксы.
Пример использования:
import { useToggleState } from '@react-stately/toggle';
function SwitchExample() {
let state = useToggleState({ defaultSelected: false });
return (
<button onCl ick={() => state.toggle()} aria-pressed={state.isSelected}>
{state.isSelected ? 'Включено' : 'Выключено'}
</button>
);
}
Ключевые моменты:
defaultSelected — начальное состояние компонента.isSelected — текущее состояние (true/false).toggle() — метод для переключения состояния.Хук полностью управляет внутренним состоянием и корректно обновляет ARIA-атрибуты.
useListStateХук useListState используется для управления состоянием
списков, включая выделение элементов и фильтрацию.
Пример:
import { useListState } from '@react-stately/list';
function ListExample({ items }) {
let state = useListState({ items, selectionMode: 'single' });
return (
<ul>
{state.collection.map(item => (
<li
key={item.key}
onCl ick={() => state.select(item.key)}
aria-selected={state.selectionManager.isSelected(item.key)}
>
{item.rendered}
</li>
))}
</ul>
);
}
Ключевые моменты:
selectionMode может быть 'single' или
'multiple'.state.selectionManager управляет выделением
элементов.state.collection.useMenuTriggerStateХук для управления состоянием выпадающих меню и контекстных меню.
Пример:
import { useMenuTriggerState } from '@react-stately/menu';
function MenuButtonExample() {
let state = useMenuTriggerState({});
return (
<>
<button onCl ick={state.open}>
Открыть меню
</button>
{state.isOpen && (
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
</ul>
)}
</>
);
}
Ключевые моменты:
isOpen — состояние открытия меню.open() и close() управляют
видимостью.useMenu и useMenuTrigger.useCheckboxStateХук useCheckboxState упрощает создание контролируемых и
неконтролируемых чекбоксов.
Пример:
import { useCheckboxState } from '@react-stately/checkbox';
function CheckboxExample() {
let state = useCheckboxState({ defaultSelected: false });
return (
<input
type="checkbox"
checked={state.isSelected}
onCha nge={state.toggle}
/>
);
}
Ключевые моменты:
indeterminate состояния для частично
выбранных групп чекбоксов.useTabListState и
useTabStateХуки для управления вкладками и состоянием выбранной вкладки.
Пример:
import { useTabListState } from '@react-stately/tabs';
function TabsExample({ tabs }) {
let state = useTabListState({ selectedKey: tabs[0].key, tabs });
return (
<div role="tablist">
{tabs.map(tab => (
<button
key={tab.key}
role="tab"
aria-selected={state.selectedKey === tab.key}
onCl ick={() => state.setSelectedKey(tab.key)}
>
{tab.name}
</button>
))}
<div role="tabpanel">
{tabs.find(tab => tab.key === state.selectedKey).content}
</div>
</div>
);
}
Ключевые моменты:
selectedKey хранит текущую выбранную вкладку.setSelectedKey изменяет выбор.useOverlayTriggerStateИспользуется для управления модальными окнами, всплывающими подсказками и оверлеями.
Пример:
import { useOverlayTriggerState } from '@react-stately/overlays';
function ModalExample() {
let state = useOverlayTriggerState({});
return (
<>
<button onCl ick={state.open}>Открыть модальное окно</button>
{state.isOpen && (
<div role="dialog">
<p>Содержимое модального окна</p>
<button onCl ick={state.close}>Закрыть</button>
</div>
)}
</>
);
}
Ключевые моменты:
isOpen и методы
open()/close() управляют видимостью.useOverlay.aria-*.useListState +
useMenuTriggerState, позволяет создавать сложные
компоненты, такие как многоуровневые меню или вкладочные панели с
динамическим содержимым.Хуки состояния React Aria делают управление интерактивными компонентами предсказуемым, безопасным с точки зрения доступности и легким для интеграции в любые UI-системы.