Skip to main content

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

Цель и область применения

Этот документ охватывает пять основополагающих примитивов в Слое 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 (Макеты) в конечном итоге компонуют или расширяют эти пять примитивов.
Источники: README.md62-103 src/components/ui/Block/Block.tsx1-88

Пять основных примитивов

Обзорная таблица

Источники: README.md81-103

Фундаментальные паттерны React

Реализация forwardRef

Все базовые компоненты реализуют forwardRef для предоставления ссылки на базовый DOM-элемент родительским компонентам. Это позволяет выполнять императивные операции с DOM и интегрироваться со сторонними библиотеками.
Пример структуры из компонента Block: src/components/ui/Block/Block.tsx33-36
Источники: src/components/ui/Block/Block.tsx33-86

Композиция типов TypeScript

Базовые компоненты компонуют множество интерфейсов TypeScript для достижения типобезопасности между HTML-атрибутами, пропсами вариантов и кастомными пропсами компонента.
Паттерн композиции типов из Block: src/components/ui/Block/Block.tsx20-31
Источники: src/components/ui/Block/Block.tsx20-31

Деструктуризация пропсов и пересылка HTML-атрибутов

Базовые компоненты явно деструктурируют пропсы вариантов и пересылают оставшиеся HTML-атрибуты в базовый DOM-элемент, используя оператор spread (...props).
Паттерн деструктуризации пропсов из Block: src/components/ui/Block/Block.tsx34-61
Источники: src/components/ui/Block/Block.tsx34-86

Специфичные возможности компонентов

Block: семантический HTML-контейнер

Block разработан для семантических блочных элементов. По умолчанию имеет w='full' (полная ширина) и предоставляет проп variant для выбора семантических HTML5-элементов. Ключевые характеристики:
  • Выбор семантического элемента через проп variant
  • Полная ширина по умолчанию (w='full')
  • Поддерживает все варианты spacing, color, layout, rounded, shadow и border
  • Использует data-class="block" для обращения к DOM
Разрешение типа элемента: src/components/ui/Block/Block.tsx62-68
Примеры использования:
Источники: src/components/ui/Block/Block.tsx1-88 README.md85-87

Box: гибкий универсальный контейнер

Box является самым гибким примитивом, принимающим любой ElementType через проп component. Не имеет ширины по умолчанию и минимальных дефолтных настроек, что делает его подходящим для инлайн-элементов и кастомных макетов. Ключевые характеристики:
  • Принимает любой React ElementType (div, span, p, a, button, кастомные компоненты)
  • Нет ширины или высоты по умолчанию
  • Поддерживает варианты spacing, color и layout
  • Использует data-class="box" для обращения к DOM
Примеры использования:
Источники: README.md85 src/components/ui/Box/index.ts1

Grid: CSS Grid макет

Grid предоставляет возможности CSS Grid макета с пропсами для колонок, строк и промежутков. Ключевые характеристики:
  • display: grid применяется по умолчанию
  • Проп cols для количества колонок
  • Проп rows для количества строк
  • Проп gap для промежутков в сетке
  • Поддерживает варианты spacing и layout
Примеры использования:
Источники: README.md88

Flex: Flexbox макет

Flex предоставляет возможности Flexbox макета с пропсами для направления, выравнивания и распределения. Ключевые характеристики:
  • display: flex применяется по умолчанию
  • Проп direction для flex-direction
  • Проп align для align-items
  • Проп justify для justify-content
  • Поддерживает варианты spacing и layout
Примеры использования:
Источники: README.md88

Stack: упрощенное расположение

Stack — это специализированный flex-контейнер для вертикального или горизонтального расположения с постоянными промежутками. Ключевые характеристики:
  • Упрощенный API по сравнению с Flex
  • Проп direction: ‘vertical’ (по умолчанию) или ‘horizontal’
  • Проп gap для промежутков между дочерними элементами
  • Автоматический flex-макет
Примеры использования:
Источники: README.md89

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

Базовые компоненты применяют варианты, используя утилиту cn(), которая объединяет сгенерированные вариантами классы с кастомными пропсами className, используя tw-merge для разрешения конфликтов.
Паттерн применения из Block: src/components/ui/Block/Block.tsx70-79
Источники: src/components/ui/Block/Block.tsx70-79

Паттерн импорта и экспорта

Базовые компоненты следуют единообразной структуре импорта/экспорта для tree-shaking и типобезопасности.

Структура файлов компонента

Каждый базовый компонент имеет отдельную директорию с двумя файлами:

Паттерн импорта в файлах компонентов

src/components/ui/Block/Block.tsx3-18

Паттерн экспорта в index-файлах

src/components/ui/Box/index.ts1
Структура экспорта:
  • Именованный экспорт для компонента
  • Именованный экспорт для интерфейса пропсов TypeScript с использованием ключевого слова type
  • Нет экспортов по умолчанию (обеспечивает единообразный синтаксис импорта)
Источники: src/components/ui/Block/Block.tsx1-18 src/components/ui/Box/index.ts1

Атрибуты data-class

Все базовые компоненты включают атрибут data-class для единообразного обращения к DOM в тестах, CSS-селекторах и инструментах отладки.
Использование из компонента Block: src/components/ui/Block/Block.tsx69
Пример тестирования у потребителя:
Источники: src/components/ui/Block/Block.tsx69

Соглашение displayName

Все базовые компоненты устанавливают displayName для улучшения опыта отладки в React DevTools и сообщениях об ошибках. src/components/ui/Block/Block.tsx88
Преимущества:
  • Четкие имена компонентов в дереве компонентов React DevTools
  • Улучшенные трассировки стека ошибок
  • Лучшая отладка с предупреждениями React.StrictMode
Источники: src/components/ui/Block/Block.tsx88

Связь с верхними слоями

Базовые компоненты служат основой для Слоя 2 (UI-компоненты) и Слоя 3 (Макеты). Компоненты более высокого уровня либо расширяют базовые компоненты дополнительными пропсами, либо компонуют несколько базовых компонентов вместе.
Паттерн расширения (Card расширяет Block):
Паттерн композиции (DashLayout использует Grid):
Источники: README.md62-168

Резюме

Базовые компоненты реализуют пять фундаментальных паттернов:
  1. forwardRef - предоставляют ссылки на DOM родительским компонентам
  2. Композиция типов - комбинируют React.HTMLAttributes с типами пропсов вариантов
  3. Деструктуризация пропсов - извлекают пропсы вариантов и пересылают HTML-атрибуты
  4. Применение вариантов - применяют варианты CVA через утилиту cn()
  5. Семантический HTML - рендерят соответствующие HTML5-элементы через проп component
Эти паттерны обеспечивают:
  • Типобезопасные API компонентов с полным выводом типов TypeScript
  • Прямой доступ к системе вариантов без накладных расходов на пересылку пропсов
  • Гибкую семантическую HTML-структуру для доступности
  • Единообразное обращение к DOM через атрибуты data-class
  • Чистую отладку в React DevTools с displayName
Все компоненты более высокого уровня в библиотеке либо расширяют, либо компонуют эти пять примитивов, обеспечивая архитектурную согласованность во всей системе. Источники: README.md62-103 src/components/ui/Block/Block.tsx1-88 .devin/wiki.json56-63