Radix UI предоставляет набор полностью управляемых компонентов для создания меню с высокой доступностью и гибкой кастомизацией. Основные строительные блоки меню включают Item, CheckboxItem и RadioGroup, каждый из которых выполняет конкретную функцию в пользовательском интерфейсе. Рассмотрим их детально.
Menu.Item — базовый элемент меню, предназначенный для
выбора действия пользователем. Он поддерживает клавиатурную навигацию,
фокус и управление состоянием через пропсы.
Ключевые свойства и особенности:
disabled — делает элемент неактивным.onSelect — обработчик выбора элемента.asChild — позволяет использовать сторонние компоненты
вместо стандартного HTML-элемента.Пример использования:
<Menu.Root>
<Menu.Trigger>Открыть меню</Menu.Trigger>
<Menu.Content>
<Menu.Item onSel ect={() => console.log('Сохранить')}>Сохранить</Menu.Item>
<Menu.Item onSel ect={() => console.log('Удалить')} disabled>Удалить</Menu.Item>
</Menu.Content>
</Menu.Root>
В данном примере первый элемент активен и реагирует на выбор, второй — неактивен. Radix UI обеспечивает корректное управление фокусом и поддерживает доступность по стандарту WAI-ARIA.
Menu.CheckboxItem расширяет функциональность
Menu.Item и используется для элементов меню, которые могут
быть отмечены или сняты. Поддерживается как отдельное состояние, так и
управление через внешний state.
Ключевые особенности:
checked — указывает текущее состояние
(true/false).onCheckedChange — коллбек, вызываемый при изменении
состояния.Пример использования:
const [darkMode, setDarkMode] = React.useState(false);
<Menu.Root>
<Menu.Trigger>Настройки</Menu.Trigger>
<Menu.Content>
<Menu.CheckboxItem
checked={darkMode}
onCheckedCha nge={(checked) => setDarkMode(checked)}
>
Тёмная тема
</Menu.CheckboxItem>
</Menu.Content>
</Menu.Root>
В этом примере элемент CheckboxItem связывается с
состоянием React. Пользователь может включать и выключать флажок с
помощью мыши или клавиатуры, а состояние синхронизируется с
приложением.
Menu.RadioGroup используется для организации группы
взаимно исключающих элементов меню. Каждый элемент внутри группы
представлен через Menu.RadioItem, который может быть выбран
только один раз.
Основные свойства:
value — текущее выбранное значение группы.onValueChange — обработчик изменения выбранного
элемента.Menu.RadioItem принимает value для
идентификации выбранного пункта.Пример использования:
const [viewMode, setViewMode] = React.useState('list');
<Menu.Root>
<Menu.Trigger>Вид отображения</Menu.Trigger>
<Menu.Content>
<Menu.RadioGroup value={viewMode} onValueCha nge={setViewMode}>
<Menu.RadioItem value="list">Список</Menu.RadioItem>
<Menu.RadioItem value="grid">Сетка</Menu.RadioItem>
<Menu.RadioItem value="compact">Компактный</Menu.RadioItem>
</Menu.RadioGroup>
</Menu.Content>
</Menu.Root>
Здесь RadioGroup управляет состоянием выбранного режима
отображения. Пользователь может переключаться между вариантами, а
состояние сохраняется в React.
| Элемент | Тип поведения | Управление состоянием | Клавиатурная доступность |
|---|---|---|---|
Menu.Item |
Одноразовое действие | Через onSelect |
Arrow, Enter, Space |
Menu.CheckboxItem |
Флаг (вкл/выкл) | Через checked и onCheckedChange |
Arrow, Space, Enter |
Menu.RadioGroup |
Взаимно исключающие элементы | Через value и onValueChange |
Arrow, Space, Enter |
asChild, чтобы интегрировать стилизованные
компоненты из styled-components или
Tailwind.Item,
CheckboxItem и RadioGroup, создавая
иерархические и интерактивные панели.RadioGroup, чтобы избежать конфликтов состояния.Эти элементы позволяют строить гибкие, доступные и полностью управляемые меню, которые легко интегрируются с React-состоянием и сторонними стилями. В комбинации они создают мощный инструмент для создания современных пользовательских интерфейсов.