Переход с других библиотек

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, компонент сам управляет состоянием.

Доступность (Accessibility) по умолчанию

Все компоненты Radix UI создаются с фокусом на доступность и семантику:

  • Используются правильные ARIA-атрибуты.
  • Поддерживаются клавиатурные взаимодействия, такие как навигация через Tab, Esc для закрытия модальных окон и стрелки для выбора элементов списка.
  • Обеспечивается корректная работа с экранными читалками.

При переходе с библиотек, где доступность частично реализована через стили или опциональные 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>

Стилизация и интеграция с CSS-фреймворками

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 — минимальные строительные блоки для создания интерактивных элементов. Это позволяет:

  • Легко кастомизировать поведение компонентов.
  • Создавать собственные темы без ограничения дизайна.
  • Избегать избыточной функциональности, встроенной в готовые UI-библиотеки.

Советы по миграции

  1. Начать с основных примитивов: Button, Dialog, Popover, Tooltip.
  2. Использовать контролируемый режим для компонентов с состоянием, чтобы интегрировать их с Redux или Zustand.
  3. Переписать стили отдельно: создать глобальные классы или тему в выбранной CSS-библиотеке.
  4. Проверить доступность: убедиться, что фокусировка и клавиатурная навигация работают корректно.
  5. Интеграция с анимациями: Radix UI не ограничивает использование сторонних библиотек анимации.

Переход на Radix UI требует изменения парадигмы: от готовых визуальных компонентов к контролируемым, доступным и стилизуемым примитивам, что позволяет создать интерфейс, полностью соответствующий дизайнерским требованиям без компромиссов по функциональности.