React Aria предоставляет набор хуков для создания доступных интерфейсных компонентов с соблюдением стандартов ARIA. Подменю и вложенные меню являются частью более сложных элементов навигации, требующих правильной организации состояния, управления фокусом и соответствующих атрибутов для экранных считывателей.
В React Aria подменю обычно строятся на основе следующих элементов:
Для вложенного меню ключевым моментом является использование MenuTrigger внутри MenuItem, что позволяет создавать иерархию.
import { useMenu, useMenuItem, useMenuTrigger, MenuTrigger } from '@react-aria/menu';
import { useButton } from '@react-aria/button';
import { useOverlayTriggerState } from '@react-stately/overlays';
function NestedMenu() {
let state = useOverlayTriggerState({});
let triggerRef = React.useRef();
let { menuTriggerProps, menuProps } = useMenuTrigger({}, state, triggerRef);
let { buttonProps } = useButton(menuTriggerProps, triggerRef);
return (
<>
<button {...buttonProps} ref={triggerRef}>
Основное меню
</button>
{state.isOpen && (
<Menu {...menuProps}>
<MenuItem key="1">Элемент 1</MenuItem>
<MenuItem key="2">
<MenuTrigger>
Подменю
<NestedSubMenu />
</MenuTrigger>
</MenuItem>
<MenuItem key="3">Элемент 3</MenuItem>
</Menu>
)}
</>
);
}
Для корректного открытия и закрытия вложенных меню используется useOverlayTriggerState из React Stately. Этот хук обеспечивает контроль над видимостью меню, синхронизацию фокуса и возможность закрытия подменю при клике вне него или при навигации клавиатурой.
import { useOverlayTriggerState } from '@react-stately/overlays';
let subMenuState = useOverlayTriggerState({});
Важно, что каждое подменю должно иметь свой независимый стейт, чтобы изменения состояния одного подменю не влияли на остальные элементы меню.
Подменю требуют правильного указания атрибутов ARIA:
React Aria автоматически назначает эти атрибуты через хуки useMenu, useMenuItem и useMenuTrigger, но при кастомной разметке важно проверять их присутствие.
Вложенные меню должны поддерживать клавиатурную навигацию:
React Aria обеспечивает эту функциональность через хуки состояния и событий, однако при создании кастомных компонентов следует убедиться, что события клавиатуры корректно обрабатываются на всех уровнях вложенности.
Подменю часто формируются динамически, поэтому важно поддерживать уникальные ключи для каждого элемента и правильно передавать их в хуки useMenuItem. Это обеспечивает правильную фокусировку и идентификацию элементов для экранных считывателей.
<Menu {...menuProps}>
{items.map(item => (
<MenuItem key={item.id}>{item.name}</MenuItem>
))}
</Menu>
Вложенные меню в React Aria легко интегрируются с:
Для всех случаев сохраняется единая логика управления состоянием и доступности, что позволяет строить сложные интерфейсы без нарушения стандартов ARIA.
Эти подходы обеспечивают плавную работу интерфейсов и соответствие стандартам доступности даже при больших структурах меню.