Компонент Root в Radix UI выполняет роль контейнера и точки входа для многих интерактивных элементов, таких как выпадающие меню, модальные окна и тултипы. Он управляет состоянием дочерних компонентов и обеспечивает согласованное поведение интерфейса. Обычно Root используется один раз на уровне одного интерактивного элемента и оборачивает остальные компоненты, такие как Trigger и Content.
Ключевые особенности Root:
open и onOpenChange.Пример использования:
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>
Trigger — компонент, инициирующий открытие или закрытие Root. Он может быть любой интерактивной HTML-элемент (кнопка, ссылка, иконка), но рекомендуется использовать семантически правильные элементы для доступности.
Основные свойства и возможности:
asChild позволяет обернуть кастомный элемент, сохранив
функциональность Trigger.Пример с кастомным элементом:
<DropdownMenu.Trigger asChild>
<button>Открыть меню</button>
</DropdownMenu.Trigger>
Anchor используется для позиционирования компонентов Content относительно определённого элемента. Он часто применяется, когда требуется точное расположение тултипов, поповеров и выпадающих меню.
Основные моменты:
@radix-ui/react-primitive
или напрямую с CSS-свойствами позиционирования.Пример использования:
<DropdownMenu.Anchor>
<span>Наведи сюда</span>
</DropdownMenu.Anchor>
<DropdownMenu.Content>Содержимое меню</DropdownMenu.Content>
Portal позволяет рендерить компоненты вне стандартного DOM-дерева родителя. Это важно для элементов, которым требуется независимое позиционирование и контроль z-index, например, модальные окна или всплывающие подсказки.
Особенности Portal:
Пример применения:
<DropdownMenu.Portal>
<DropdownMenu.Content>Содержимое меню</DropdownMenu.Content>
</DropdownMenu.Portal>
Content отображает визуальную часть интерактивного элемента и всегда находится внутри Root. Он отвечает за внешний вид, размеры и позиционирование, а также может содержать элементы взаимодействия, такие как Item, Checkbox или Radio.
Особенности компонента Content:
Пример с анимацией:
<DropdownMenu.Content
sideOffset={5}
className="dropdown-content"
>
<DropdownMenu.Item>Пункт 1</DropdownMenu.Item>
<DropdownMenu.Item>Пункт 2</DropdownMenu.Item>
</DropdownMenu.Content>
Важные параметры Content:
side — сторона, с которой Content появляется
относительно Trigger.align — выравнивание относительно Trigger
(start, center, end).sideOffset и alignOffset — точная
настройка позиции для гибкой верстки.Эти компоненты в совокупности образуют мощный инструмент для создания сложных и доступных интерактивных интерфейсов. Их взаимодействие обеспечивает управление состоянием, позиционирование, визуальное отображение и доступность без необходимости писать дополнительную логику с нуля.