Сравни подходы к написанию переиспользуемых компонентов и объясни, когда какой подход выбрать.
Компоненты
Переиспользуемый компонент можно спроектировать по-разному; выбор — компромисс между простотой API, гибкостью и контролем над разметкой.
Props-конфигурация
<Select options={opts} placeholder="Выбор" size="md" onChange={fn} />- Плюсы: простой и явный API, легко типизировать, быстрый старт.
- Минусы: «пропс-взрыв» при росте требований (optionIcon, renderBadge, emptyText…); нестандартный кейс не собрать.
- Выбирать: простые компоненты с ограниченным числом вариаций (Button, Input, Badge).
Композиция через children и слоты
<Card header={<Title/>} footer={<Actions/>}>{body}</Card>- Плюсы: разметку определяет потребитель; убирает prop drilling и лишние рендеры.
- Минусы: контракт менее очевиден, чем список props.
- Выбирать: контейнеры, layout'ы, обёртки.
Составные компоненты (compound)
<Tabs value={tab} onChange={setTab}>
<Tabs.List><Tabs.Trigger value="a">A</Tabs.Trigger></Tabs.List>
<Tabs.Panel value="a">…</Tabs.Panel>
</Tabs>- Плюсы: гибкая структура при общей логике через внутренний контекст; так устроены Radix/Headless UI.
- Минусы: больше кода, потребителю нужно знать структуру.
- Выбирать: сложные виджеты с несколькими частями (Select, Tabs, Accordion, Modal).
Headless (хук/логика без разметки)
const table = useReactTable(config); // вёрстка полностью ваша- Плюсы: максимум контроля над DOM и стилями, переиспользование логики между разными UI.
- Минусы: разметку пишете сами.
- Выбирать: сложная логика + собственная дизайн-система (таблицы, формы, комбобоксы).
HOC
Устаревший способ расширения; уместен, когда нужно обернуть чужой компонент или подменить рендер (ErrorBoundary, memo).
Коротко для собеседования
Простой компонент — props-конфигурация; контейнеры и layout — композиция children/слотов; сложный виджет с частями — compound-компоненты с внутренним контекстом; сложная логика при своей вёрстке — headless-хуки. HOC — легаси. Правило: начинать с props, переходить к композиции, когда props начинают описывать разметку.