Базовые компоненты
Эта страница представляет полный справочник API для пяти фундаментальных примитивных компонентов вsrc/core/ui/. Это компоненты уровня 1 (атомы), которые служат основными строительными блоками для всех компонентов более высокого уровня в библиотеке.
Область применения: Эта страница охватывает только базовые примитивы: Block, Box, Grid, Flex и Stack. Для расширенных UI-компонентов (Button, Card, Badge и т.д.) см. UI-компоненты. Для архитектурных объяснений и паттернов композиции см. Базовые компоненты.
Обзор компонентов
Базовые примитивы предоставляют низкоуровневые возможности рендеринга с прямым доступом к системе вариантов CVA. Они рендерят семантические HTML5-элементы, принимая пропсы вариантов для стилизации.Сравнение компонентов
| Компонент | Основное назначение | Семантический элемент | Тип макета | Ключевые варианты |
|---|---|---|---|---|
Block | Семантические секции | section, article, nav, header, footer, aside, main, div | Блочный контейнер | Все варианты (отступы, цвета, макет, эффекты) |
Box | Универсальный контейнер | div, span, любой HTML-элемент | Гибкий примитив | Все варианты (отступы, цвета, макет, эффекты) |
Grid | CSS Grid макеты | div с display: grid | CSS Grid | Специфичные для Grid (cols, rows, areas) + варианты макета |
Flex | Flexbox макеты | div с display: flex | Flexbox | Специфичные для Flex (direction, align, justify) + варианты макета |
Stack | Вертикальное/горизонтальное размещение | div с flex | Стековый макет | Специфичные для Stack (gap, direction) + варианты отступов |
Компонент Block
КомпонентBlock рендерит семантические HTML5 структурные элементы с полной поддержкой системы вариантов. Это основной контейнер для создания секций страницы с семантическим значением.
Определение типа
Справочник пропсов
| Пропс | Тип | По умолчанию | Описание |
|---|---|---|---|
children | ReactNode | Обязательный | Содержимое для рендеринга внутри блока |
component | ElementType | - | Переопределить рендерящийся HTML-элемент |
variant | 'section' | 'main' | 'nav' | 'article' | 'header' | 'footer' | 'aside' | 'div' | 'div' | Семантический HTML-элемент для рендеринга |
p, px, py, pt, pb, pl, pr | Значения отступов | - | Варианты padding |
m, mx, my, mt, mb, ml, mr | Значения отступов | - | Варианты margin |
bg | Токен цвета | - | Цвет фона |
c | Токен цвета | - | Цвет текста |
borderColor | Токен цвета | - | Цвет границы |
w | Значение макета | 'full' | Ширина |
h | Значение макета | - | Высота |
minH | Значение макета | - | Минимальная высота |
position | 'relative' | 'absolute' | 'fixed' | 'sticky' | - | CSS position |
rounded | Значение rounded | - | Радиус границы |
shadow | Значение shadow | - | Тень элемента |
border, borderTop, borderBottom, borderLeft, borderRight | Значение border | - | Стили границ |
className | string | - | Дополнительные CSS-классы |
ref | Ref<HTMLElement> | - | Пробрасываемая ссылка на базовый DOM-элемент |
Реализация forwardRef
КомпонентBlock использует паттерн React forwardRef для предоставления ссылки на базовый DOM-элемент:
- Обобщенный тип
forwardRef<HTMLElement, BlockProps>обеспечивает типобезопасный доступ к ref - Параметр
refавтоматически типизируется какRef<HTMLElement> - ref передается базовому DOM-элементу
displayNameустанавливается для отладки в React DevTools
Поток применения вариантов
Примеры использования
Базовая семантическая секция:Атрибуты данных
Все экземплярыBlock автоматически получают data-class="block" для согласованного таргетирования DOM:
Компонент Box
КомпонентBox является наиболее гибким примитивом, способным рендерить любой HTML-элемент с полной поддержкой вариантов. Он служит низкоуровневым строительным блоком для пользовательских компонентов.
Определение типа
Справочник пропсов
| Пропс | Тип | По умолчанию | Описание |
|---|---|---|---|
children | ReactNode | - | Содержимое для рендеринга (опционально для пустых элементов) |
component | ElementType | 'div' | HTML-элемент или компонент для рендеринга |
as | ElementType | - | Алиас для пропса component |
| Все пропсы отступов | Значения отступов | - | Варианты padding и margin |
| Все пропсы цветов | Токены цветов | - | Цвета фона, текста, границы |
| Все пропсы макета | Значения макета | - | Ширина, высота, позиция, отображение |
| Все пропсы эффектов | Значения эффектов | - | Скругление, тень, граница |
className | string | - | Дополнительные CSS-классы |
ref | Ref<HTMLElement> | - | Пробрасываемая ссылка на DOM-элемент |
Полиморфизм компонента
КомпонентBox поддерживает полиморфный рендеринг через пропс component или as:
Проброс атрибутов TypeScript
КомпонентBox расширяет React.HTMLAttributes<HTMLElement>, что означает:
- Все стандартные HTML-атрибуты типобезопасны:
onClick,onMouseOver,data-*,aria-*и т.д. - Атрибуты пробрасываются базовому элементу: Пропсы, не используемые вариантами, передаются дальше
- Вывод типов работает с пропсом
component: TypeScript сужает типы атрибутов на основе элемента
Примеры использования
Универсальный контейнер:Компонент Grid
КомпонентGrid предоставляет возможности макета CSS Grid с декларативными пропсами для специфичной конфигурации сетки.
Определение типа
Справочник пропсов
| Пропс | Тип | По умолчанию | Описание |
|---|---|---|---|
children | ReactNode | Обязательный | Элементы сетки для размещения |
cols | number | string | - | Значение grid-template-columns (например, 2, ‘1fr 2fr’, ‘repeat(3, 1fr)‘) |
rows | number | string | - | Значение grid-template-rows |
areas | string | - | Значение grid-template-areas |
autoFlow | Значения auto-flow Grid | 'row' | Направление для автоматически размещаемых элементов |
gap | Значение отступа | - | Промежуток между элементами сетки |
alignItems | Значение выравнивания | - | Вертикальное выравнивание элементов внутри ячеек |
justifyItems | Значение выравнивания | - | Горизонтальное выравнивание элементов внутри ячеек |
alignContent | Значение выравнивания | - | Вертикальное выравнивание сетки внутри контейнера |
justifyContent | Значение выравнивания | - | Горизонтальное выравнивание сетки внутри контейнера |
p, px, py | Значения отступов | - | Варианты padding |
w, h, minH | Значения макета | - | Размеры контейнера |
ref | Ref<HTMLDivElement> | - | Пробрасываемая ссылка на контейнер сетки |
Паттерны макета Grid
Примеры использования
Простая колоночная сетка:Компонент Flex
КомпонентFlex предоставляет возможности макета Flexbox с декларативными пропсами для специфичной конфигурации flex.
Определение типа
Справочник пропсов
| Пропс | Тип | По умолчанию | Описание |
|---|---|---|---|
children | ReactNode | Обязательный | Flex-элементы для размещения |
direction | 'row' | 'row-reverse' | 'column' | 'column-reverse' | 'row' | Направление главной оси |
align | 'start' | 'end' | 'center' | 'stretch' | 'baseline' | - | Выравнивание по поперечной оси (align-items) |
justify | 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly' | - | Выравнивание по главной оси (justify-content) |
wrap | 'nowrap' | 'wrap' | 'wrap-reverse' | 'nowrap' | Переносятся ли элементы на несколько строк |
inline | boolean | false | Использовать display: inline-flex вместо display: flex |
gap | Значение отступа | - | Промежуток между flex-элементами |
p, px, py | Значения отступов | - | Варианты padding |
w, h, minH | Значения макета | - | Размеры контейнера |
ref | Ref<HTMLDivElement> | - | Пробрасываемая ссылка на flex-контейнер |
Модель осей Flexbox
Примеры использования
Горизонтальный макет с отступами:Компонент Stack
КомпонентStack упрощает вертикальное или горизонтальное размещение с автоматическими промежутками. Это специализированная версия Flex, оптимизированная для распространенных паттернов размещения.
Определение типа
Справочник пропсов
| Пропс | Тип | По умолчанию | Описание |
|---|---|---|---|
children | ReactNode | Обязательный | Элементы для размещения |
direction | 'vertical' | 'horizontal' | 'vertical' | Направление размещения |
spacing | Значение отступа | - | Промежуток между элементами (внутренне соответствует gap) |
gap | Значение отступа | - | Альтернативное название пропса для spacing |
align | Значение выравнивания | - | Выравнивание по поперечной оси |
justify | Значение выравнивания | - | Выравнивание по главной оси |
p, px, py | Значения отступов | - | Варианты padding |
w, h, minH | Значения макета | - | Размеры контейнера |
ref | Ref<HTMLDivElement> | - | Пробрасываемая ссылка на контейнер стека |
Сравнение Stack и Flex
| Характеристика | Stack | Flex |
|---|---|---|
| API направления | 'vertical' | 'horizontal' | 'row' | 'column' | 'row-reverse' | 'column-reverse' |
| Перенос | Не поддерживается | Доступен пропс wrap |
| Основное назначение | Простые паттерны размещения | Сложные макеты, требующие полного контроля flex |
| Пропс gap | spacing или gap | Только gap |
| Простота API | Упрощенный для распространенных случаев | Полный API flexbox |
Примеры использования
Вертикальный стек (по умолчанию):Система типов TypeScript
Композиция типов пропсов вариантов
Все базовые компоненты составляют свои интерфейсы пропсов из общих определений типов вариантов:Обобщенные параметры типа
Сигнатура обобщенного типаforwardRef обеспечивает типобезопасность как для пропсов, так и для ссылок:
- Пропсы полностью типизированы: Автодополнение работает для всех пропсов вариантов
- Тип ref соответствует элементу:
ref.currentтипизируется какHTMLElement - HTML-атрибуты валидируются: Некорректные атрибуты вызывают ошибки TypeScript
- Полиморфизм компонента безопасен: Пропс
componentсужает типы атрибутов
Типы пересечения пропсов
Базовые компоненты используют типы пересечения TypeScript (&) для объединения нескольких интерфейсов пропсов:
- Слияние пропсов: Все пропсы вариантов доступны в компоненте
- Отсутствие коллизий пропсов: TypeScript гарантирует отсутствие перекрывающихся имен пропсов
- Поддержка IntelliSense: Автодополнение IDE показывает все доступные пропсы
- Сужение типов: Опциональные пропсы правильно типизируются как
T | undefined
Руководство по выбору компонента
Дерево решений
Рекомендации по использованию
| Сценарий | Рекомендуемый компонент | Обоснование |
|---|---|---|
| Секция страницы с семантическим значением | Block variant="section" | Преимущества для SEO и доступности от семантического HTML |
| Навигационная панель | Block variant="nav" | Правильная метка для программ чтения с экрана |
| Содержимое статьи | Block variant="article" | Семантическая структура для контента |
| Контейнер формы | Block component="form" | Семантический элемент формы с поддержкой вариантов |
| Универсальный div-контейнер | Box | Наиболее гибкий примитив, любой элемент |
| Кнопка или ссылка со стилизацией | Box component="button" | Полный контроль над типом элемента и стилизацией |
| Многоколоночный макет | Grid cols={3} | Декларативный API Grid |
| Сетка карточек (адаптивная) | Grid cols="repeat(auto-fit, ...)" | Адаптивная сетка без медиа-запросов |
| Горизонтальная группа кнопок | Stack direction="horizontal" | Простой API для горизонтальных отступов |
| Вертикальные поля формы | Stack gap="lg" | Чистое размещение с согласованными промежутками |
| Навбар с space-between | Flex justify="between" | Контроль выравнивания Flexbox |
| Сложный адаптивный макет | Flex wrap="wrap" | Перенос с полным контролем flex |
Лучшие практики
1. Предпочитайте семантические элементы
ИспользуйтеBlock с семантическими вариантами вместо универсальных элементов div, когда структура имеет значение:
2. Используйте полиморфизм компонента
Используйте пропсcomponent для рендеринга правильного HTML-элемента с сохранением пропсов вариантов:
3. Выбирайте правильный компонент макета
Не используйтеFlex для простого размещения; Stack более читаем:
4. Используйте пропсы вариантов
Используйте пропсы вариантов вместоclassName для распространенных стилей:
5. Пробрасывайте ссылки для доступа к DOM
Всегда указывайте типы ссылок при доступе к DOM-элементам:Интеграция с системой вариантов
Паттерн импорта вариантов
Все базовые компоненты импортируют и применяют варианты изsrc/core/variants/:
Слияние классов с cn()
Утилитаcn() (из class-variance-authority) интеллектуально объединяет классы Tailwind:
- Дедуплицирует конфликтующие классы:
cn('p-4', 'p-8')→'p-8'(последний побеждает) - Сохраняет неконфликтующие классы:
cn('p-4 bg-red', 'mt-4')→'p-4 bg-red mt-4' - Обрабатывает условные классы:
cn('base', condition && 'conditional')→ условное включение
Покрытие вариантов
Базовые компоненты предоставляют доступ к следующим категориям вариантов:| Категория вариантов | Пропсы | Значения | Покрытие |
|---|---|---|---|
| Отступы | p, px, py, pt, pb, pl, pr, m, mx, my, mt, mb, ml, mr | none, xs, sm, md, lg, xl, 2xl, auto | ~80% потребностей в отступах |
| Цвета | bg, c, borderColor | Токены дизайн-системы | Полная цветовая палитра |
| Макет | w, h, minH, maxW, position | Адаптивные размеры | Распространенные размеры |
| Эффекты | rounded, shadow | Предопределенные шкалы | Визуальные улучшения |
| Границы | border, borderTop, borderBottom, borderLeft, borderRight | Стили границ | Декорирование краев |
Распространенные паттерны
Паттерн 1: Макет формы с Block и Box
Паттерн 2: Сеточный макет панели управления
Паттерн 3: Шапка страницы с Flex
Паттерн 4: Боковая навигация
Соображения производительности
1. Извлечение пропсов вариантов
Пропсы вариантов извлекаются и обрабатываются при каждом рендере. Для критичных по производительности компонентов с множеством пропсов вариантов:2. Накладные расходы проброса ссылок
ПаттернforwardRef добавляет минимальные накладные расходы, но необходим для доступа к DOM. Если вам не нужны ссылки, обычные компоненты были бы незначительно быстрее (но базовые компоненты всегда используют forwardRef для согласованности).
3. Стоимость слияния классов
Утилитаcn() выполняет разбор строк при каждом рендере. Для статических строк className, которые не меняются:
4. Компромисс между компонентом и элементом
Использование базовых компонентов добавляет тонкий слой абстракции поверх чистого HTML. Для критичных по производительности сценариев с тысячами элементов (например, виртуализированные списки), рассмотрите использование чистого HTML с классами Tailwind:Связанная документация
- Система вариантов - Полная документация системы вариантов на основе CVA
- UI-компоненты - Справочник API для расширенных компонентов (Button, Card и т.д.)
- Компоненты макетов - Справочник API для шаблонов макетов (DashLayout и т.д.)
- Архитектура базовых компонентов - Архитектурное объяснение и паттерны композиции
- Лучшие практики - Общие руководства по эффективному использованию компонентов
- Продвинутый рабочий процесс - Примеры композиции Block + Box для пользовательских форм