Radix UI — это низкоуровневая библиотека компонентов для React, ориентированная на доступность и расширяемость. Основой для большинства интерактивных элементов служат три ключевых компонента: Root, List и Trigger. Их понимание необходимо для построения сложных пользовательских интерфейсов с меню, селекторами и раскрывающимися списками.
Root является корневым контейнером для большинства компонентов Radix UI. Он обеспечивает контекст, через который вложенные элементы взаимодействуют между собой.
Пример использования Root в меню:
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
<DropdownMenu.Root>
<DropdownMenu.Trigger>Меню</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item>Пункт 1</DropdownMenu.Item>
<DropdownMenu.Item>Пункт 2</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
Здесь Root оборачивает все элементы меню, включая Trigger и Content, обеспечивая управление состоянием открытия.
Trigger — это элемент, который инициирует открытие или закрытие компонента внутри Root. Обычно это кнопка, иконка или любой интерактивный элемент.
aria-haspopup, aria-expanded и поддержку
клавиатуры по стандартам WAI-ARIA.Пример кастомного Trigger:
<DropdownMenu.Trigger asChild>
<button className="custom-button">Открыть меню</button>
</DropdownMenu.Trigger>
Использование asChild позволяет использовать собственный
компонент вместо стандартного, сохраняя все встроенные возможности Radix
UI.
List представляет собой контейнер для элементов выбора внутри меню или селектора. Он может использоваться как Content в DropdownMenu или Items в Select.
Пример List в DropdownMenu:
<DropdownMenu.Content>
<DropdownMenu.Item>Пункт A</DropdownMenu.Item>
<DropdownMenu.Item disabled>Пункт B (неактивен)</DropdownMenu.Item>
<DropdownMenu.Item>Пункт C</DropdownMenu.Item>
</DropdownMenu.Content>
Здесь Content действует как контейнер List, а каждый Item автоматически получает навигацию и управление фокусом.
Благодаря такому разделению ответственности компоненты Radix UI остаются полностью контролируемыми, доступными и расширяемыми. Например, можно создать кастомное меню с иконками, радиокнопками и чекбоксами, полностью используя Root для состояния, Trigger для открытия и List для структурирования элементов:
<DropdownMenu.Root>
<DropdownMenu.Trigger>Настройки</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item>Профиль</DropdownMenu.Item>
<DropdownMenu.CheckboxItem checked>
Уведомления
</DropdownMenu.CheckboxItem>
<DropdownMenu.RadioGroup value="dark">
<DropdownMenu.RadioItem value="light">Светлая тема</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem value="dark">Тёмная тема</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.Content>
</DropdownMenu.Root>
Такой подход позволяет создавать сложные интерфейсы с минимальным количеством кода и гарантированной доступностью.
Хотя Root, Trigger и List выглядят как простые строительные блоки, их комбинация позволяет реализовывать полностью интерактивные и управляемые компоненты с поддержкой клавиатуры, фокуса и корректных ARIA-атрибутов. Это делает Radix UI идеальной основой для создания кастомных меню, селекторов и всплывающих элементов интерфейса в React.