useTabs — это хук, предоставляемый библиотекой
React Aria, предназначенный для управления компонентами
вкладок с полной поддержкой доступности (accessibility). Он
инкапсулирует логику навигации, фокусировки и управления состоянием
активной вкладки, позволяя разработчику сосредоточиться на визуальном
отображении интерфейса.
Хук автоматически обрабатывает:
aria-selected,
aria-controls, role="tablist",
role="tab", role="tabpanel") для корректного
взаимодействия с экранными читалками.useTabs на практикеДля базового применения useTabs требуется два основных
компонента:
TabList)TabPanel) для каждой вкладкиПример структуры:
import { useTabs, useTab, useTabPanel } from '@react-aria/tabs';
import { useTabListState } from '@react-stately/tabs';
function TabsExample() {
const state = useTabListState({
selectedKey: 'tab1',
onSelectionChange: key => console.log(key),
items: [
{ key: 'tab1', name: 'Вкладка 1' },
{ key: 'tab2', name: 'Вкладка 2' },
{ key: 'tab3', name: 'Вкладка 3' },
]
});
const { tabListProps } = useTabs({ orientation: 'horizontal' }, state);
return (
<div>
<div {...tabListProps}>
{state.collection.map(item => (
<Tab key={item.key} item={item} state={state} />
))}
</div>
{state.collection.map(item => (
<TabPanel key={item.key} item={item} state={state} />
))}
</div>
);
}
function Tab({ item, state }) {
const ref = React.useRef();
const { tabProps } = useTab({ key: item.key }, state, ref);
return (
<button {...tabProps} ref={ref}>
{item.name}
</button>
);
}
function TabPanel({ item, state }) {
const ref = React.useRef();
const { tabPanelProps } = useTabPanel({ key: item.key }, state, ref);
return state.selectedKey === item.key ? (
<div {...tabPanelProps} ref={ref}>
Контент {item.name}
</div>
) : null;
}
useTabsorientation – 'horizontal' или
'vertical'. Определяет направление вкладок и клавиши
навигации.
keyboardActivation – 'automatic'
или 'manual'.
automatic – переключение вкладки при перемещении фокуса
стрелками.manual – вкладка меняется только при нажатии Enter или
Space.onSelectionChange – функция, вызываемая при изменении выбранной вкладки.
useTabuseTabPanelrole="tabpanel" и aria-labelledby.useTabs автоматически обеспечивает навигацию через:
keyboardActivation равен 'manual').Фокус перемещается на следующую активную вкладку, а ARIA-атрибуты обновляются автоматически, обеспечивая совместимость с экранными читалками.
useTabListStateХук useTabListState из React Stately хранит и управляет состоянием:
Пример динамического обновления:
state.selectedKey = 'tab2'; // программная смена вкладки
React Aria делает вкладки полностью доступными:
Эта структура гарантирует корректное взаимодействие с экранными читалками и клавиатурой.
useTabs позволяет легко менять ориентацию:
const { tabListProps } = useTabs({ orientation: 'vertical' }, state);
Клавиши навигации автоматически адаптируются под ориентацию.
Пример:
const { tabListProps } = useTabs(
{ orientation: 'horizontal', keyboardActivation: 'manual' },
state
);
Это полезно, если содержимое вкладки тяжелое для рендеринга или требует подтверждения.
useTabs вместе с
useTabListState для управления состоянием.useTab с уникальным
key.useTabPanel.orientation для корректной
навигации.keyboardActivation в зависимости от UX и
производительности рендеринга.Структурированное применение этих хуков позволяет создавать полностью доступные, удобные и легко масштабируемые интерфейсы вкладок.