Radix UI предоставляет высоко настраиваемые и доступные компоненты интерфейса, одним из которых является Menu. Правильная структура элементов меню играет ключевую роль в обеспечении как удобства использования, так и соответствия стандартам доступности (accessibility, a11y).
В Radix UI меню строится из нескольких базовых компонентов:
Menu.Root — корневой компонент меню,
управляющий состоянием открытия/закрытия.Menu.Trigger — элемент, который
открывает меню, чаще всего кнопка.Menu.Content — контейнер для элементов
меню.Menu.Item — отдельный пункт меню.Menu.Group — логическая группа пунктов
меню с опциональным заголовком.Menu.Label — заголовок группы или
всего меню.Menu.Separator — визуальный
разделитель между пунктами или группами.Menu.CheckboxItem /
Menu.RadioItem — пункты меню с состоянием
выбора.Иерархия компонентов в Radix UI строится строго по принципу Root → Trigger → Content → Item. Ошибки в иерархии могут привести к некорректной работе фокуса и потере доступности.
Пример базовой структуры:
import * as Menu from '@radix-ui/react-menu';
<Menu.Root>
<Menu.Trigger>Открыть меню</Menu.Trigger>
<Menu.Content>
<Menu.Item onSel ect={() => console.log('Первый пункт')}>Пункт 1</Menu.Item>
<Menu.Item onSel ect={() => console.log('Второй пункт')}>Пункт 2</Menu.Item>
<Menu.Separator />
<Menu.Group>
<Menu.Label>Дополнительно</Menu.Label>
<Menu.Item onSel ect={() => console.log('Третий пункт')}>Пункт 3</Menu.Item>
</Menu.Group>
</Menu.Content>
</Menu.Root>
Menu.Group и Menu.LabelMenu.Group позволяет объединять
элементы меню в логические блоки.Menu.Label внутри группы обеспечивает
семантическую структуру для пользователей экранных читалок.Рекомендация: каждый блок, который требует пояснения или имеет
смысловой контекст, оформлять через Menu.Group с
Menu.Label.
Для интерактивных меню часто используют
Menu.CheckboxItem и
Menu.RadioItem. Они позволяют реализовать
мультивыбор и выбор из нескольких опций:
<Menu.Root>
<Menu.Trigger>Настройки</Menu.Trigger>
<Menu.Content>
<Menu.CheckboxItem checked={true} onCheckedCha nge={() => console.log('Состояние изменено')}>
Включить уведомления
</Menu.CheckboxItem>
<Menu.RadioGroup value="option1" onValueCha nge={(val) => console.log(val)}>
<Menu.RadioItem value="option1">Опция 1</Menu.RadioItem>
<Menu.RadioItem value="option2">Опция 2</Menu.RadioItem>
</Menu.RadioGroup>
</Menu.Content>
</Menu.Root>
Ключевой момент: Menu.RadioItem должен находиться внутри
Menu.RadioGroup, иначе управление
состоянием станет некорректным.
Menu.Separator используется для
логического отделения элементов и групп.
Radix UI обеспечивает полноценную поддержку клавиатуры:
Важно сохранять правильную структуру: любой элемент, не являющийся
Menu.Item, Menu.CheckboxItem или
Menu.RadioItem, должен находиться внутри
Menu.Content для корректной навигации с клавиатуры.
Menu.Content поддерживает передачу классов или стилей
через className и style.open, highlighted), что позволяет менять их
внешний вид динамически.Menu.Label для заголовков групп.Menu.Separator для визуальной
организации.CheckboxItem, RadioItem) должны корректно
обновлять состояние через пропсы checked и
value.Эта структура обеспечивает консистентность меню, корректное поведение на разных устройствах и полную поддержку accessibility, что является одной из ключевых целей Radix UI.