Базовые компоненты
Эта страница представляет полный справочник API для пяти фундаментальных примитивных компонентов вsrc/core/ui/. Это компоненты уровня 1 (атомы), которые служат основными строительными блоками для всех компонентов более высокого уровня в библиотеке.
Область применения: Эта страница охватывает только базовые примитивы: Block, Box, Grid, Flex и Stack. Для расширенных UI-компонентов (Button, Card, Badge и т.д.) см. UI-компоненты. Для архитектурных объяснений и паттернов композиции см. Базовые компоненты.
Обзор компонентов
Базовые примитивы предоставляют низкоуровневые возможности рендеринга с прямым доступом к системе вариантов CVA. Они рендерят семантические HTML5-элементы, принимая пропсы вариантов для стилизации.Сравнение компонентов
Источники: README.md82-103 Диаграмма 1
Компонент Block
КомпонентBlock рендерит семантические HTML5 структурные элементы с полной поддержкой системы вариантов. Это основной контейнер для создания секций страницы с семантическим значением.
Определение типа
Справочник пропсов
Реализация 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-элемент с полной поддержкой вариантов. Он служит низкоуровневым строительным блоком для пользовательских компонентов.
Определение типа
Справочник пропсов
Полиморфизм компонента
КомпонентBox поддерживает полиморфный рендеринг через пропс component или as:
Проброс атрибутов TypeScript
КомпонентBox расширяет React.HTMLAttributes<HTMLElement>, что означает:
- Все стандартные HTML-атрибуты типобезопасны:
onClick,onMouseOver,data-*,aria-*и т.д. - Атрибуты пробрасываются базовому элементу: Пропсы, не используемые вариантами, передаются дальше
- Вывод типов работает с пропсом
component: TypeScript сужает типы атрибутов на основе элемента
Примеры использования
Универсальный контейнер:Компонент Grid
КомпонентGrid предоставляет возможности макета CSS Grid с декларативными пропсами для специфичной конфигурации сетки.
Определение типа
Справочник пропсов
Паттерны макета Grid
Примеры использования
Простая колоночная сетка:Компонент Flex
КомпонентFlex предоставляет возможности макета Flexbox с декларативными пропсами для специфичной конфигурации flex.
Определение типа
Справочник пропсов
Модель осей Flexbox
Примеры использования
Горизонтальный макет с отступами:Компонент Stack
КомпонентStack упрощает вертикальное или горизонтальное размещение с автоматическими промежутками. Это специализированная версия Flex, оптимизированная для распространенных паттернов размещения.
Определение типа
Справочник пропсов
Сравнение Stack и Flex
Примеры использования
Вертикальный стек (по умолчанию):Система типов TypeScript
Композиция типов пропсов вариантов
Все базовые компоненты составляют свои интерфейсы пропсов из общих определений типов вариантов:Обобщенные параметры типа
Сигнатура обобщенного типаforwardRef обеспечивает типобезопасность как для пропсов, так и для ссылок:
- Пропсы полностью типизированы: Автодополнение работает для всех пропсов вариантов
- Тип ref соответствует элементу:
ref.currentтипизируется какHTMLElement - HTML-атрибуты валидируются: Некорректные атрибуты вызывают ошибки TypeScript
- Полиморфизм компонента безопасен: Пропс
componentсужает типы атрибутов
Типы пересечения пропсов
Базовые компоненты используют типы пересечения TypeScript (&) для объединения нескольких интерфейсов пропсов:
- Слияние пропсов: Все пропсы вариантов доступны в компоненте
- Отсутствие коллизий пропсов: TypeScript гарантирует отсутствие перекрывающихся имен пропсов
- Поддержка IntelliSense: Автодополнение IDE показывает все доступные пропсы
- Сужение типов: Опциональные пропсы правильно типизируются как
T | undefined
Руководство по выбору компонента
Дерево решений
Рекомендации по использованию
Источники: README.md82-103 Диаграмма 1
Лучшие практики
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')→ условное включение
Покрытие вариантов
Базовые компоненты предоставляют доступ к следующим категориям вариантов:
Для полной документации по вариантам см. Система вариантов.
Источники: README.md170-217 Диаграмма 3
Распространенные паттерны
Паттерн 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 для пользовательских форм