Radix UI предоставляет низкоуровневые, доступные и полностью
управляемые компоненты пользовательского интерфейса. Среди них
Root, Menu и Trigger являются
ключевыми элементами для построения интерактивных меню и всплывающих
элементов управления. Они обеспечивают правильное управление состоянием,
фокусом и доступностью, позволяя создавать сложные интерфейсы без потери
контроля над поведением.
Root — это основной контейнер для
компонентов Radix UI, таких как Menu, Dialog
или Popover. Он служит точкой управления состоянием и
контекстом для дочерних компонентов.
Особенности:
Root предоставляет
контекст, который управляет открытием, закрытием и взаимодействием
дочерних элементов.open может контролироваться внешне через пропсы или
управляться внутренне автоматически.Root обеспечивает
корректную работу клавиатурных и мышиных событий для вложенных
компонентов.Пример использования Root с Menu:
import * as Menu from '@radix-ui/react-menu';
<Menu.Root>
<Menu.Trigger>Открыть меню</Menu.Trigger>
<Menu.Content>
<Menu.Item>Пункт 1</Menu.Item>
<Menu.Item>Пункт 2</Menu.Item>
<Menu.Item>Пункт 3</Menu.Item>
</Menu.Content>
</Menu.Root>
Здесь Menu.Root выступает как контейнер всего меню. Все
дочерние компоненты получают доступ к состоянию open и
могут реагировать на события взаимодействия пользователя.
Menu — это основное содержимое меню,
которое может включать интерактивные элементы, подменю и разделители. В
Radix UI Menu разделен на несколько компонентов:
Menu.Content — контейнер с визуальным
отображением меню.Menu.Item — отдельный интерактивный
пункт меню.Menu.Label — заголовок группы
элементов.Menu.Separator — горизонтальная линия
для разделения элементов.Menu.Group — логическая группа
элементов внутри меню.Ключевые моменты:
Menu.Content автоматически позиционируется относительно
Trigger с использованием механизма портала.Enter и Space для выбора.Пример вложенного меню с разделителями и группами:
<Menu.Root>
<Menu.Trigger>Меню действий</Menu.Trigger>
<Menu.Content sideOffset={5}>
<Menu.Group>
<Menu.Item>Редактировать</Menu.Item>
<Menu.Item>Копировать</Menu.Item>
</Menu.Group>
<Menu.Separator />
<Menu.Group>
<Menu.Item>Удалить</Menu.Item>
</Menu.Group>
</Menu.Content>
</Menu.Root>
sideOffset позволяет задать отступ меню от триггера,
обеспечивая точное позиционирование.
Trigger — это интерактивный элемент,
который открывает меню или другой компонент внутри Root.
Trigger может быть кнопкой, иконкой или любым другим
элементом, поддерживающим события взаимодействия.
Особенности:
aria-haspopup,
aria-expanded и aria-controls генерируются
автоматически.Trigger
может находиться текст, иконки или другие элементы, обеспечивая гибкий
дизайн.Пример использования Trigger с кастомной кнопкой:
<Menu.Root>
<Menu.Trigger asChild>
<button className="custom-button">
Опции
</button>
</Menu.Trigger>
<Menu.Content>
<Menu.Item>Сохранить</Menu.Item>
<Menu.Item>Загрузить</Menu.Item>
</Menu.Content>
</Menu.Root>
asChild позволяет использовать любой элемент в качестве
триггера, не теряя функциональности Radix UI.
Использование этих компонентов совместно позволяет создавать полностью доступные, интерактивные и гибко настраиваемые меню, которые работают корректно как с мышью, так и с клавиатурой, обеспечивая консистентный UX.
Menu.Sub и отдельные Menu.Content для
вложенных уровней.asChild для кастомных кнопок, чтобы
сохранить доступность.open и
onOpenChange позволяет интегрировать меню с глобальным
состоянием приложения, например Redux или Zustand.sideOffset и align для
точного позиционирования меню относительно триггера, особенно в
адаптивной верстке.Эта комбинация компонентов образует фундамент для построения интерактивных и доступных интерфейсов с Radix UI, обеспечивая мощный контроль над поведением и стилем элементов, без необходимости вручную реализовывать сложную логику управления фокусом и состоянием.