Radix UI предоставляет низкоуровневые, полностью доступные компоненты для React, которые можно использовать как основу для построения сложных интерфейсов. Для начала работы необходимо установить пакет через npm или yarn:
npm install @radix-ui/react-<component>
# или
yarn add @radix-ui/react-<component>
Каждый компонент Radix UI распространяется отдельным пакетом, что позволяет подключать только нужные элементы, минимизируя размер итогового бандла. Для удобства можно использовать отдельный каталог для компонентов Radix и централизованно управлять их импортом.
Пример базового импорта компонента Dialog:
import * as Dialog from '@radix-ui/react-dialog';
Использование * as обеспечивает доступ к всем
экспортируемым подкомпонентам, таким как Dialog.Trigger,
Dialog.Content и Dialog.Close.
Radix UI следует паттерну compound components, где один компонент является контейнером, а дочерние элементы обеспечивают управление состоянием и отображением. Это позволяет создавать гибкие интерфейсы без необходимости ручного управления внутренним состоянием.
Пример структуры DropdownMenu:
<DropdownMenu.Root>
<DropdownMenu.Trigger>Открыть меню</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item>Пункт 1</DropdownMenu.Item>
<DropdownMenu.Item>Пункт 2</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item>Пункт 3</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
Ключевые моменты архитектуры:
Root — основной контейнер, управляющий состоянием
компонента.Trigger — элемент, инициирующий открытие/закрытие.Content — область, где отображаются дочерние
элементы.Item — отдельный интерактивный элемент.Separator — визуальный разделитель между
элементами.Каждый подкомпонент наследует доступность по умолчанию, включая поддержку клавиатурной навигации и ARIA-атрибутов.
Radix UI предлагает два подхода к управлению состоянием компонентов: контролируемый и неконтролируемый. Неконтролируемое состояние управляется внутренне и идеально подходит для простых сценариев:
<DropdownMenu.Root>
<DropdownMenu.Trigger>Меню</DropdownMenu.Trigger>
<DropdownMenu.Content>Содержимое</DropdownMenu.Content>
</DropdownMenu.Root>
Контролируемое состояние позволяет интегрировать компонент с глобальным состоянием приложения:
const [open, setOpen] = useState(false);
<DropdownMenu.Root open={open} onOpenCha nge={setOpen}>
<DropdownMenu.Trigger>Меню</DropdownMenu.Trigger>
<DropdownMenu.Content>Содержимое</DropdownMenu.Content>
</DropdownMenu.Root>
Такой подход необходим при синхронизации нескольких компонентов или при сохранении состояния при переходах между страницами.
Radix UI не навязывает конкретный стиль, предоставляя unstyled components. Это означает, что визуальное оформление полностью контролируется разработчиком, что идеально подходит для систем дизайна с Tailwind CSS, CSS Modules или Styled Components.
Для анимации контента компонентов часто используют библиотеку
@radix-ui/react-animations или CSS-переходы. Пример
анимации открытия диалога с использованием Tailwind:
<Dialog.Content className="animate-fade-in bg-white p-6 rounded-lg shadow-lg">
Контент диалога
</Dialog.Content>
Radix UI обеспечивает высокую степень доступности без дополнительных настроек:
Tab,
Arrow Keys, Esc).FocusTrap для модальных окон).Пример использования диалога с корректным управлением фокусом:
<Dialog.Root>
<Dialog.Trigger>Открыть</Dialog.Trigger>
<Dialog.Content>
<Dialog.Title>Заголовок</Dialog.Title>
<Dialog.Description>Описание действия</Dialog.Description>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Root>
Radix UI легко интегрируется с существующими системами дизайна благодаря отсутствию стилей по умолчанию. Для создания консистентного интерфейса используют комбинацию:
Пример интеграции кнопки Radix с Tailwind:
<DropdownMenu.Trigger className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700">
Меню
</DropdownMenu.Trigger>
Для эффективной работы с Radix UI рекомендуется использовать:
Radix UI позволяет создавать кастомные композиции, используя контекст для передачи состояния между дочерними компонентами:
const MyContext = React.createContext();
function MyComponent() {
const [value, setValue] = useState(false);
return (
<MyContext.Provider value={{ value, setValue }}>
<Child />
</MyContext.Provider>
);
}
function Child() {
const { value, setValue } = useContext(MyContext);
return <button onCl ick={() => setValue(!value)}>{value ? 'Вкл' : 'Выкл'}</button>;
}
Radix UI поддерживает динамическое позиционирование элементов через
хук usePopper или встроенные свойства side и
align для меню и тултипов:
<Tooltip.Content side="top" align="center">
Подсказка
</Tooltip.Content>
Radix UI предоставляет мощный набор инструментов для создания доступных, гибких и полностью управляемых компонентов React. Архитектура compound components, контроль состояния и полная свобода стилизации делают библиотеку идеальным выбором для сложных интерфейсов и систем дизайна.