Radix UI — это низкоуровневая библиотека компонентов для React, ориентированная на предоставление полностью управляемой, доступной и настраиваемой базы для создания интерфейсов. Переход с таких библиотек, как Material-UI, Chakra UI или Ant Design, требует понимания нескольких фундаментальных отличий в подходе к построению компонентов.
В отличие от большинства UI-библиотек, Radix UI не включает встроенные темы или стили. Все визуальное оформление оставлено за разработчиком, что позволяет интегрировать любые CSS-фреймворки, Tailwind или собственные стили. Ключевое отличие — компоненты предоставляют функциональность, а не визуальный слой.
Пример: В Chakra UI кнопка сразу имеет стили и темы:
<Button colorScheme="blue">Нажать</Button>
В Radix UI необходимо создать кнопку и добавить стили вручную:
import * as Button from '@radix-ui/react-button';
<Button.Root className="bg-blue-500 text-white px-4 py-2 rounded">
Нажать
</Button.Root>
Radix UI ориентирован на контролируемые и неконтролируемые
компоненты, предоставляя гибкий API для управления состоянием.
Компоненты, такие как Dialog, Popover или
DropdownMenu, позволяют полностью контролировать открытие и
закрытие, а также интеграцию с состоянием приложения.
Контролируемый пример:
import * as Dialog from '@radix-ui/react-dialog';
import { useState } from 'react';
function App() {
const [open, setOpen] = useState(false);
return (
<Dialog.Root open={open} onOpenCha nge={setOpen}>
<Dialog.Trigger>Открыть</Dialog.Trigger>
<Dialog.Content>Содержимое диалога</Dialog.Content>
</Dialog.Root>
);
}
Неконтролируемый пример: Если не указывать
open и onOpenChange, компонент сам управляет
состоянием.
Все компоненты Radix UI создаются с фокусом на доступность и семантику:
При переходе с библиотек, где доступность частично реализована через стили или опциональные props, Radix UI гарантирует, что логика доступности встроена на уровне компонентов.
Многие Radix UI-компоненты, такие как Dialog,
Tooltip или Popover, используют
порталы, что позволяет рендерить элементы вне основного
DOM-дерева, сохраняя правильное поведение z-index и фокусировки. Это
отличается от некоторых UI-библиотек, где модальные окна рендерятся
inline.
Пример:
import * as Tooltip from '@radix-ui/react-tooltip';
<Tooltip.Provider>
<Tooltip.Root>
<Tooltip.Trigger>Наведи на меня</Tooltip.Trigger>
<Tooltip.Content>Подсказка</Tooltip.Content>
</Tooltip.Root>
</Tooltip.Provider>
Radix UI предоставляет utility-first API через
className, что позволяет интегрировать Tailwind,
Emotion, Stitches или любые другие решения. Для сложных интерфейсов
рекомендуется использовать Radix Primitives в сочетании с
CSS-in-JS для управления анимациями и состояниями.
Пример с анимацией через Stitches:
import { styled } from '@stitches/react';
import * as Dialog from '@radix-ui/react-dialog';
const StyledContent = styled(Dialog.Content, {
backgroundColor: 'white',
borderRadius: 8,
padding: 20,
boxShadow: '0 10px 15px rgba(0,0,0,0.2)',
animation: 'fadeIn 0.3s ease-out',
});
<Dialog.Root>
<Dialog.Trigger>Открыть</Dialog.Trigger>
<StyledContent>Содержимое диалога</StyledContent>
</Dialog.Root>
Radix UI предоставляет Primitives — минимальные строительные блоки для создания интерактивных элементов. Это позволяет:
Переход на Radix UI требует изменения парадигмы: от готовых визуальных компонентов к контролируемым, доступным и стилизуемым примитивам, что позволяет создать интерфейс, полностью соответствующий дизайнерским требованиям без компромиссов по функциональности.