Базовые компоненты
Цель и область применения
Этот документ охватывает пять основополагающих примитивов в Слое 1 архитектуры:Block, Box, Grid, Flex и Stack. Эти компоненты служат строительными блоками для всех компонентов UI и макетов более высокого уровня в библиотеке. Они предоставляют прямой доступ к системе вариантов CVA и реализуют фундаментальные паттерны React, включая forwardRef, композицию типов TypeScript и пересылку HTML-атрибутов.
Для документации по составным компонентам, расширяющим эти примитивы (Button, Card и др.), см. UI-компоненты. Для подробностей о системе вариантов см. Система вариантов.
Источники: README.md81-103 .devin/wiki.json56-63
Архитектурная роль
Базовые компоненты формируют основу трехслойной архитектуры. Они являются единственными компонентами, которые напрямую применяют систему вариантов CVA и рендерят семантические HTML5-элементы. Все компоненты Слоя 2 (UI-компоненты) и Слоя 3 (Макеты) в конечном итоге компонуют или расширяют эти пять примитивов.Пять основных примитивов
Обзорная таблица
| Компонент | Основное назначение | Поддержка семантического HTML | Ключевые варианты | Ширина по умолчанию |
|---|---|---|---|---|
Block | Семантические блочные контейнеры | section, article, nav, header, footer, aside, main, div | spacing, color, layout, rounded, shadow, border | w='full' |
Box | Универсальный гибкий контейнер | Любой ElementType (div, span, p и т.д.) | spacing, color, layout | Нет по умолчанию |
Grid | Макеты CSS Grid | div с display: grid | spacing, layout, cols, rows, gap | Нет по умолчанию |
Flex | Макеты Flexbox | div с display: flex | spacing, layout, direction, align, justify | Нет по умолчанию |
Stack | Вертикальное/горизонтальное расположение | div с flexbox-расположением | spacing, gap, direction | Нет по умолчанию |
Фундаментальные паттерны React
Реализация forwardRef
Все базовые компоненты реализуютforwardRef для предоставления ссылки на базовый DOM-элемент родительским компонентам. Это позволяет выполнять императивные операции с DOM и интегрироваться со сторонними библиотеками.
Композиция типов TypeScript
Базовые компоненты компонуют множество интерфейсов TypeScript для достижения типобезопасности между HTML-атрибутами, пропсами вариантов и кастомными пропсами компонента.Деструктуризация пропсов и пересылка HTML-атрибутов
Базовые компоненты явно деструктурируют пропсы вариантов и пересылают оставшиеся HTML-атрибуты в базовый DOM-элемент, используя оператор spread (...props).
Специфичные возможности компонентов
Block: семантический HTML-контейнер
Block разработан для семантических блочных элементов. По умолчанию имеет w='full' (полная ширина) и предоставляет проп variant для выбора семантических HTML5-элементов.
Ключевые характеристики:
- Выбор семантического элемента через проп
variant - Полная ширина по умолчанию (
w='full') - Поддерживает все варианты spacing, color, layout, rounded, shadow и border
- Использует
data-class="block"для обращения к DOM
Box: гибкий универсальный контейнер
Box является самым гибким примитивом, принимающим любой ElementType через проп component. Не имеет ширины по умолчанию и минимальных дефолтных настроек, что делает его подходящим для инлайн-элементов и кастомных макетов.
Ключевые характеристики:
- Принимает любой React
ElementType(div, span, p, a, button, кастомные компоненты) - Нет ширины или высоты по умолчанию
- Поддерживает варианты spacing, color и layout
- Использует
data-class="box"для обращения к DOM
Grid: CSS Grid макет
Grid предоставляет возможности CSS Grid макета с пропсами для колонок, строк и промежутков.
Ключевые характеристики:
display: gridприменяется по умолчанию- Проп
colsдля количества колонок - Проп
rowsдля количества строк - Проп
gapдля промежутков в сетке - Поддерживает варианты spacing и layout
Flex: Flexbox макет
Flex предоставляет возможности Flexbox макета с пропсами для направления, выравнивания и распределения.
Ключевые характеристики:
display: flexприменяется по умолчанию- Проп
directionдля flex-direction - Проп
alignдля align-items - Проп
justifyдля justify-content - Поддерживает варианты spacing и layout
Stack: упрощенное расположение
Stack — это специализированный flex-контейнер для вертикального или горизонтального расположения с постоянными промежутками.
Ключевые характеристики:
- Упрощенный API по сравнению с
Flex - Проп
direction: ‘vertical’ (по умолчанию) или ‘horizontal’ - Проп
gapдля промежутков между дочерними элементами - Автоматический flex-макет
Паттерн применения вариантов
Базовые компоненты применяют варианты, используя утилитуcn(), которая объединяет сгенерированные вариантами классы с кастомными пропсами className, используя tw-merge для разрешения конфликтов.
Паттерн импорта и экспорта
Базовые компоненты следуют единообразной структуре импорта/экспорта для tree-shaking и типобезопасности.Структура файлов компонента
Каждый базовый компонент имеет отдельную директорию с двумя файлами:Паттерн импорта в файлах компонентов
src/components/ui/Block/Block.tsx3-18Паттерн экспорта в index-файлах
src/components/ui/Box/index.ts1- Именованный экспорт для компонента
- Именованный экспорт для интерфейса пропсов TypeScript с использованием ключевого слова
type - Нет экспортов по умолчанию (обеспечивает единообразный синтаксис импорта)
Атрибуты data-class
Все базовые компоненты включают атрибутdata-class для единообразного обращения к DOM в тестах, CSS-селекторах и инструментах отладки.
Соглашение displayName
Все базовые компоненты устанавливаютdisplayName для улучшения опыта отладки в React DevTools и сообщениях об ошибках.
src/components/ui/Block/Block.tsx88
- Четкие имена компонентов в дереве компонентов React DevTools
- Улучшенные трассировки стека ошибок
- Лучшая отладка с предупреждениями React.StrictMode
Связь с верхними слоями
Базовые компоненты служат основой для Слоя 2 (UI-компоненты) и Слоя 3 (Макеты). Компоненты более высокого уровня либо расширяют базовые компоненты дополнительными пропсами, либо компонуют несколько базовых компонентов вместе.Резюме
Базовые компоненты реализуют пять фундаментальных паттернов:- forwardRef - предоставляют ссылки на DOM родительским компонентам
- Композиция типов - комбинируют
React.HTMLAttributesс типами пропсов вариантов - Деструктуризация пропсов - извлекают пропсы вариантов и пересылают HTML-атрибуты
- Применение вариантов - применяют варианты CVA через утилиту
cn() - Семантический HTML - рендерят соответствующие HTML5-элементы через проп
component
- Типобезопасные API компонентов с полным выводом типов TypeScript
- Прямой доступ к системе вариантов без накладных расходов на пересылку пропсов
- Гибкую семантическую HTML-структуру для доступности
- Единообразное обращение к DOM через атрибуты
data-class - Чистую отладку в React DevTools с
displayName