Skip to main content

Базовые компоненты

Эта страница представляет полный справочник API для пяти фундаментальных примитивных компонентов в src/core/ui/. Это компоненты уровня 1 (атомы), которые служат основными строительными блоками для всех компонентов более высокого уровня в библиотеке. Область применения: Эта страница охватывает только базовые примитивы: Block, Box, Grid, Flex и Stack. Для расширенных UI-компонентов (Button, Card, Badge и т.д.) см. UI-компоненты. Для архитектурных объяснений и паттернов композиции см. Базовые компоненты.

Обзор компонентов

Базовые примитивы предоставляют низкоуровневые возможности рендеринга с прямым доступом к системе вариантов CVA. Они рендерят семантические HTML5-элементы, принимая пропсы вариантов для стилизации.
Источники: README.md82-103 Диаграмма 1 из высокоуровневой архитектуры

Сравнение компонентов

Источники: README.md82-103 Диаграмма 1

Компонент Block

Компонент Block рендерит семантические HTML5 структурные элементы с полной поддержкой системы вариантов. Это основной контейнер для создания секций страницы с семантическим значением.

Определение типа

Справочник пропсов

Реализация forwardRef

Компонент Block использует паттерн React forwardRef для предоставления ссылки на базовый DOM-элемент:
Ключевые моменты:
  • Обобщенный тип forwardRef<HTMLElement, BlockProps> обеспечивает типобезопасный доступ к ref
  • Параметр ref автоматически типизируется как Ref<HTMLElement>
  • ref передается базовому DOM-элементу
  • displayName устанавливается для отладки в React DevTools

Поток применения вариантов

Источники: src/components/ui/Block/Block.tsx33-86

Примеры использования

Базовая семантическая секция:
Навигация с позиционированием:
Статья с тенью и скругленными углами:
Переопределение пользовательского элемента:

Атрибуты данных

Все экземпляры Block автоматически получают data-class="block" для согласованного таргетирования DOM:
Источники: src/components/ui/Block/Block.tsx1-88 README.md82-103

Компонент Box

Компонент Box является наиболее гибким примитивом, способным рендерить любой HTML-элемент с полной поддержкой вариантов. Он служит низкоуровневым строительным блоком для пользовательских компонентов.

Определение типа

Справочник пропсов

Полиморфизм компонента

Компонент Box поддерживает полиморфный рендеринг через пропс component или as:

Проброс атрибутов TypeScript

Компонент Box расширяет React.HTMLAttributes<HTMLElement>, что означает:
  1. Все стандартные HTML-атрибуты типобезопасны: onClick, onMouseOver, data-*, aria-* и т.д.
  2. Атрибуты пробрасываются базовому элементу: Пропсы, не используемые вариантами, передаются дальше
  3. Вывод типов работает с пропсом component: TypeScript сужает типы атрибутов на основе элемента

Примеры использования

Универсальный контейнер:
Элемент button:
Элемент ссылки:
Встроенный span:
Обертка для input:
Источники: README.md85-103 src/components/ui/Box/index.ts1

Компонент Grid

Компонент Grid предоставляет возможности макета CSS Grid с декларативными пропсами для специфичной конфигурации сетки.

Определение типа

Справочник пропсов

Паттерны макета Grid

Примеры использования

Простая колоночная сетка:
Адаптивная сетка с пользовательскими колонками:
Именованные области сетки:
Источники: README.md91-103

Компонент Flex

Компонент Flex предоставляет возможности макета Flexbox с декларативными пропсами для специфичной конфигурации flex.

Определение типа

Справочник пропсов

Модель осей Flexbox

Примеры использования

Горизонтальный макет с отступами:
Вертикальный стек:
Центрированное содержимое:
Альтернатива переносящейся сетки:
Источники: README.md91-103

Компонент Stack

Компонент Stack упрощает вертикальное или горизонтальное размещение с автоматическими промежутками. Это специализированная версия Flex, оптимизированная для распространенных паттернов размещения.

Определение типа

Справочник пропсов

Сравнение Stack и Flex

Примеры использования

Вертикальный стек (по умолчанию):
Горизонтальный стек:
Макет формы:
Источники: README.md91-103

Система типов TypeScript

Композиция типов пропсов вариантов

Все базовые компоненты составляют свои интерфейсы пропсов из общих определений типов вариантов:
Источники: src/components/ui/Block/Block.tsx1-18

Обобщенные параметры типа

Сигнатура обобщенного типа forwardRef обеспечивает типобезопасность как для пропсов, так и для ссылок:
Гарантии типобезопасности:
  1. Пропсы полностью типизированы: Автодополнение работает для всех пропсов вариантов
  2. Тип ref соответствует элементу: ref.current типизируется как HTMLElement
  3. HTML-атрибуты валидируются: Некорректные атрибуты вызывают ошибки TypeScript
  4. Полиморфизм компонента безопасен: Пропс component сужает типы атрибутов
Источники: src/components/ui/Block/Block.tsx33-34

Типы пересечения пропсов

Базовые компоненты используют типы пересечения TypeScript (&) для объединения нескольких интерфейсов пропсов:
Преимущества:
  • Слияние пропсов: Все пропсы вариантов доступны в компоненте
  • Отсутствие коллизий пропсов: TypeScript гарантирует отсутствие перекрывающихся имен пропсов
  • Поддержка IntelliSense: Автодополнение IDE показывает все доступные пропсы
  • Сужение типов: Опциональные пропсы правильно типизируются как T | undefined
Источники: src/components/ui/Block/Block.tsx20-31

Руководство по выбору компонента

Дерево решений

Рекомендации по использованию

Источники: README.md82-103 Диаграмма 1

Лучшие практики

1. Предпочитайте семантические элементы

Используйте Block с семантическими вариантами вместо универсальных элементов div, когда структура имеет значение:

2. Используйте полиморфизм компонента

Используйте пропс component для рендеринга правильного HTML-элемента с сохранением пропсов вариантов:

3. Выбирайте правильный компонент макета

Не используйте Flex для простого размещения; Stack более читаем:

4. Используйте пропсы вариантов

Используйте пропсы вариантов вместо className для распространенных стилей:

5. Пробрасывайте ссылки для доступа к DOM

Всегда указывайте типы ссылок при доступе к DOM-элементам:
Источники: README.md278-359 Диаграмма 6

Интеграция с системой вариантов

Паттерн импорта вариантов

Все базовые компоненты импортируют и применяют варианты из src/core/variants/:
Источники: src/components/ui/Block/Block.tsx3-18 src/components/ui/Block/Block.tsx70-78

Слияние классов с cn()

Утилита cn() (из class-variance-authority) интеллектуально объединяет классы Tailwind:
  1. Дедуплицирует конфликтующие классы: cn('p-4', 'p-8') → 'p-8' (последний побеждает)
  2. Сохраняет неконфликтующие классы: cn('p-4 bg-red', 'mt-4') → 'p-4 bg-red mt-4'
  3. Обрабатывает условные классы: cn('base', condition && 'conditional') → условное включение
Источники: src/components/ui/Block/Block.tsx70

Покрытие вариантов

Базовые компоненты предоставляют доступ к следующим категориям вариантов: Для полной документации по вариантам см. Система вариантов. Источники: README.md170-217 Диаграмма 3

Распространенные паттерны

Паттерн 1: Макет формы с Block и Box

Паттерн 2: Сеточный макет панели управления

Паттерн 3: Шапка страницы с Flex

Паттерн 4: Боковая навигация

Источники: README.md310-359 Диаграмма 6

Соображения производительности

1. Извлечение пропсов вариантов

Пропсы вариантов извлекаются и обрабатываются при каждом рендере. Для критичных по производительности компонентов с множеством пропсов вариантов:

2. Накладные расходы проброса ссылок

Паттерн forwardRef добавляет минимальные накладные расходы, но необходим для доступа к DOM. Если вам не нужны ссылки, обычные компоненты были бы незначительно быстрее (но базовые компоненты всегда используют forwardRef для согласованности).

3. Стоимость слияния классов

Утилита cn() выполняет разбор строк при каждом рендере. Для статических строк className, которые не меняются:

4. Компромисс между компонентом и элементом

Использование базовых компонентов добавляет тонкий слой абстракции поверх чистого HTML. Для критичных по производительности сценариев с тысячами элементов (например, виртуализированные списки), рассмотрите использование чистого HTML с классами Tailwind:
Источники: README.md398-403

Связанная документация

Источники: Выведено из структуры wiki.json