В библиотеке React Aria ориентация табов задаёт направление, в котором элементы вкладок (tabs) располагаются и реагируют на клавиатурные события. Ориентация влияет на поведение клавиш навигации: стрелок, Home, End и взаимодействие с фокусом.
React Aria предоставляет TabList и
Tab через хуки useTabList и
useTab. Эти хуки позволяют управлять состоянием вкладок, их
доступностью и ориентацией, обеспечивая полную поддержку ARIA.
Ориентация задаётся свойством orientation, которое может
принимать два значения:
horizontal – вкладки располагаются по горизонтали. Навигация:
ArrowRight – переход к следующей вкладкеArrowLeft – переход к предыдущей вкладкеvertical – вкладки располагаются вертикально. Навигация:
ArrowDown – переход к следующей вкладкеArrowUp – переход к предыдущей вкладкеПример использования:
import { useTabList, useTab } from '@react-aria/tabs';
import { useTabListState } from '@react-stately/tabs';
import React from 'react';
function TabsExample() {
const tabs = [
{ name: 'Home', id: 'home' },
{ name: 'Profile', id: 'profile' },
{ name: 'Settings', id: 'settings' }
];
const state = useTabListState({ items: tabs });
const { tabListProps } = useTabList({ orientation: 'vertical' }, state);
return (
<div {...tabListProps} role="tablist">
{tabs.map((tab) => {
const { tabProps } = useTab({ key: tab.id }, state);
return (
<button {...tabProps} key={tab.id}>
{tab.name}
</button>
);
})}
</div>
);
}
В этом примере вкладки будут ориентированы вертикально, и стрелки
ArrowUp и ArrowDown будут переключать активную
вкладку.
React Aria автоматически управляет фокусом при навигации между вкладками. Для горизонтальной ориентации:
ArrowRight фокус перемещается на следующую
вкладку.ArrowLeft – на предыдущую.Home – фокус на первой вкладке.End – фокус на последней вкладке.Для вертикальной ориентации используются ArrowDown и
ArrowUp вместо горизонтальных стрелок.
Важно, что фокус перемещается только по включенным
вкладкам, пропуская отключённые (disabled)
элементы.
Ориентация тесно связана с состоянием вкладок, управляемым через
useTabListState. Например, при динамическом добавлении или
удалении вкладок библиотека корректно обновляет фокус и поддерживает
правильный порядок навигации:
const state = useTabListState({ items: dynamicTabs });
Здесь dynamicTabs может изменяться в зависимости от
пользовательского взаимодействия, а ориентация, переданная в
useTabList, автоматически применяется ко всем новым
вкладкам.
Для визуального отражения ориентации важно корректно использовать CSS:
display: flex; flex-direction: row;display: flex; flex-direction: column;Это обеспечивает согласованность между визуальным расположением и логикой навигации клавиатурой.
.tablist-horizontal {
display: flex;
flex-direction: row;
}
.tablist-vertical {
display: flex;
flex-direction: column;
}
React Aria позволяет менять ориентацию на лету, передавая новое
значение в хук useTabList. Это полезно для адаптивных
интерфейсов:
const isMobile = window.innerWidth < 600;
const { tabListProps } = useTabList({ orientation: isMobile ? 'vertical' : 'horizontal' }, state);
В данном случае на мобильных устройствах вкладки будут вертикальными, а на десктопе – горизонтальными, без потери управления клавиатурой.
При использовании вложенных табов ориентация каждой
группы задаётся отдельно. Вложенные горизонтальные табы внутри
вертикальных не конфликтуют: фокус и навигация управляются локально
через соответствующий useTabList. Главное – правильно
указывать уникальные ключи (key) для каждой вкладки и
передавать правильное состояние для каждой группы.
orientation, даже если по умолчанию
горизонтальная. Это делает код явным и понятным.useTabListState.Ориентация вкладок в React Aria обеспечивает правильную поддержку ARIA, согласованную навигацию клавиатурой и предсказуемое поведение фокуса, что делает интерфейсы доступными и удобными для всех пользователей.