Radix UI — это набор низкоуровневых, полностью настраиваемых компонентов для создания интерфейсов на React. Каждый компонент в Radix UI строится вокруг семантической структуры, что обеспечивает совместимость с доступностью (a11y) и гибкость в стилизации.
Ключевой принцип: компонент делится на три уровня:
Например, для компонента 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 — за визуальное отображение списка.
Root-компонент является сердцем компонента. Он отвечает за:
open, checked,
value),Пример для Toggle:
<Toggle.Root defaultPressed={false}>
<Toggle.Thumb />
</Toggle.Root>
defaultPressed задает начальное состояние.Toggle.Thumb визуализирует текущее состояние.Root-компонент может принимать контролируемое состояние, что позволяет интегрировать компонент с внешним состоянием приложения:
const [pressed, setPressed] = useState(false);
<Toggle.Root pressed={pressed} onPressedCha nge={setPressed}>
<Toggle.Thumb />
</Toggle.Root>
Trigger — это элемент, который инициирует действия пользователя. Его особенности:
aria-* атрибуты.Пример для Dropdown Menu Trigger:
<DropdownMenu.Trigger asChild>
<button className="menu-button">Меню</button>
</DropdownMenu.Trigger>
Использование asChild позволяет применять свой стиль к
дочернему элементу без потери логики Radix UI.
Content отображает данные, но не управляет состоянием. Он обычно рендерится через Portal, что позволяет выводить его вне DOM-иерархии родителя, предотвращая проблемы с z-index и overflow.
Пример:
<DropdownMenu.Content side="bottom" align="start">
<DropdownMenu.Item>Пункт 1</DropdownMenu.Item>
<DropdownMenu.Item>Пункт 2</DropdownMenu.Item>
</DropdownMenu.Content>
side определяет позицию относительно Trigger
(top, bottom, left,
right).align задает выравнивание (start,
center, end).asChild и композиция компонентовasChild — мощный инструмент Radix UI, позволяющий:
Пример использования в Tooltip:
<Tooltip.Root>
<Tooltip.Trigger asChild>
<button>Наведи на меня</button>
</Tooltip.Trigger>
<Tooltip.Content>Подсказка</Tooltip.Content>
</Tooltip.Root>
Без asChild Tooltip создавал бы собственный
div, что могло бы нарушить стили или позиционирование.
Radix UI поддерживает два подхода к состоянию:
defaultOpen,
defaultValue.open, value, pressed и
callback-функции.Это позволяет интегрировать компонент в приложения с глобальным состоянием, такими как Redux или Zustand, сохраняя полную предсказуемость поведения.
Radix UI автоматически:
Пример для Dropdown Menu:
ArrowDown и ArrowUp перемещают фокус между
элементами,Enter выбирает элемент,Escape закрывает меню.Это снижает необходимость вручную прописывать сложную логику доступности.
Radix UI не навязывает стили. Компоненты:
data-state="open", data-disabled,
data-active), которые можно использовать в селекторах.Пример с Tailwind:
<DropdownMenu.Item
className="px-4 py-2 cursor-pointer data-[highlighted]:bg-blue-500 data-[highlighted]:text-white"
>
Пункт меню
</DropdownMenu.Item>
Radix UI строится на композиции компонентов. Root + Trigger + Content можно комбинировать:
asChild для полной
интеграции с дизайном.Такой подход делает библиотеку гибкой, масштабируемой и полностью совместимой с React-экосистемой.