Radix UI представляет собой коллекцию низкоуровневых компонентов для React, которые обеспечивают максимальную гибкость и контроль над интерфейсом. В отличие от готовых компонентов с ограниченной кастомизацией, Radix UI предоставляет базовую функциональность, а визуальная часть полностью настраивается разработчиком.
Компоненты Radix UI построены на контролируемой и неконтролируемой модели состояния. Это означает, что разработчик может либо полностью управлять состоянием через пропсы, либо позволить компоненту работать автономно.
Пример управляемого состояния для компонента диалога:
import * as Dialog from '@radix-ui/react-dialog';
import { useState } from 'react';
function ControlledDialog() {
const [open, setOpen] = useState(false);
return (
<Dialog.Root open={open} onOpenCha nge={setOpen}>
<Dialog.Trigger>Открыть диалог</Dialog.Trigger>
<Dialog.Overlay />
<Dialog.Content>
<Dialog.Title>Заголовок диалога</Dialog.Title>
<Dialog.Description>Описание содержимого диалога</Dialog.Description>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Root>
);
}
Ключевой момент: Dialog.Root управляет
состоянием видимости, а дочерние компоненты
(Dialog.Trigger, Dialog.Content,
Dialog.Close) реализуют поведение и структуру интерфейса
без жесткой привязки к стилям.
Radix UI использует принцип unstyled components, что дает возможность применять любые CSS-решения: Tailwind, CSS Modules, Stitches или Vanilla Extract. Компоненты предоставляют только функциональность и aria-атрибуты, отвечающие за доступность.
Пример стилизации с Tailwind:
<Dialog.Content className="bg-white rounded-lg p-6 shadow-lg">
<Dialog.Title className="text-xl font-bold">Заголовок</Dialog.Title>
<Dialog.Description className="text-gray-500">
Подробное описание диалога
</Dialog.Description>
<Dialog.Close className="mt-4 px-4 py-2 bg-blue-500 text-white rounded">
Закрыть
</Dialog.Close>
</Dialog.Content>
Важно: использование utility-first подхода не влияет на функциональность компонента — только визуальную часть.
Radix UI не навязывает библиотеку анимаций, но предоставляет хуки для
управления состоянием. Например, для появления и исчезновения модального
окна можно использовать onOpenChange или
Transition из библиотеки Framer Motion.
Пример с анимацией:
import { motion, AnimatePresence } from 'framer-motion';
<AnimatePresence>
{open && (
<Dialog.Overlay asChild>
<motion.div
className="fixed inset-0 bg-black/50"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
/>
</Dialog.Overlay>
)}
</AnimatePresence>
Такой подход позволяет создавать гибкие и производительные анимации без ограничения структуры Radix UI.
Многие компоненты, такие как диалоги или тултипы, используют порталы, чтобы рендериться вне основного DOM-дерева. Это позволяет избежать проблем с z-index и перекрытиями.
<Dialog.Portal>
<Dialog.Overlay className="fixed inset-0 bg-black/50" />
<Dialog.Content className="fixed top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 bg-white p-6 rounded">
...
</Dialog.Content>
</Dialog.Portal>
При этом все события и управление состоянием остаются связанными с родительским компонентом через контекст, что упрощает взаимодействие и обеспечивает доступность.
Все компоненты Radix UI изначально следуют стандартам WAI-ARIA. Это значит, что:
Разработчику остается только настроить стили и поведение, не заботясь о низкоуровневой доступности.
Для отладки компонентов Radix UI в React DevTools следует учитывать несколько особенностей:
Root, Portal и Provider. DevTools
позволяет просматривать реальный DOM и состояние компонента через
вкладку Components.open, value, checked
могут быть видимы в инспекторе и динамически изменяться для
тестирования.Radix UI хорошо сочетается с:
Пример интеграции с формой:
import { useForm } from 'react-hook-form';
function FormDialog() {
const { register, handleSubmit } = useForm();
const onSub mit = data => console.log(data);
return (
<Dialog.Root>
<Dialog.Trigger>Открыть форму</Dialog.Trigger>
<Dialog.Content>
<form onSub mit={handleSubmit(onSubmit)}>
<input {...register('name')} placeholder="Имя" />
<Dialog.Close asChild>
<button type="submit">Отправить</button>
</Dialog.Close>
</form>
</Dialog.Content>
</Dialog.Root>
);
}
Radix UI превращает базовые компоненты интерфейса в мощные и настраиваемые строительные блоки, позволяя создавать сложные и доступные приложения с минимальными усилиями.