12 февраля 2024 г. (изменено: 12 февраля 2024 г.)
Канал: @cherkashindev
🚀 React — Compound Components
Как-то я уже упоминал паттерн Compound Components (Составные компоненты) для React, теперь остановимся на нём немного подробнее.
ℹ️ Compound components — это подход позволяет объединить несколько компонентов в единую сущность, которая неявно имеет общее состояние. Эти компоненты тесно взаимодействуют друг с другом и работают как единое целое, представляя собой полноценный UI компонент.
🔍 Основные характеристики:
- Используется React контекст, чтобы управлять состоянием
- Должен быть главный компонент, в котором хранится состояние и объявляется React контекст
- Все дочерние компоненты используют состояние через React контекст
ℹ️ Он состоит из 2 простых подходов React:
- Композиция компонентов
- Паттерн “Провайдер” — использование контекста React ** 📝 Вначале рассмотрим подх**оды по отдельности
1️⃣ Что такое композиция?
Вместо вот этого
<Tile count={money} title="Стоимость" icon={<MoneyIcon/>}/>Мы пишем вот так
<Tile>
<Title>{title}</Title>
<Number>{count}</Number>
<Icon>{icon}</Icon>
</Tile>Когда это может понадобиться? Например, когда у нас креативный дизайнер и нам нужно угодить ему:
- В одном месте, показывать карточку без иконки
- В другом, показывать карточку, где цифра то посередине, то слева, то справа, то на луне
- В третьем, нам нужно добавить иконку, чтобы при наведении показывалось описание
В итоге, мы можем легко модифицировать любую часть компонента, и по-разному их комбинировать.**
2️⃣ Паттерн “Провайде**р”
Здесь идёт речь об обычном использовании контекста реакта, чтобы передавать какие-то данные на любую глубину дерева компонентов, минуя дочерние компоненты.
🔄 Если объединить два этих подхода, то сможем реализовать паттерн Compound Components. Как пример, можно использовать компонент табов из библиотеки material-ui.
function MyTabs() {
return (
<TabContext value={value}>
<TabList onChange={handleChange}>
<Tab label="Item One" value="1" />
<Tab label="Item Two" value="2" />
<Tab label="Item Three" value="3" />
</TabList>Ï
<TabPanel value="1">Item One</TabPanel>
<TabPanel value="2">Item Two</TabPanel>
<TabPanel value="3">Item Three</TabPanel>
</TabContext>
);
}- TabContext — главный компонент, в котором хранится состояние и объявляется React контекст
TabиTabPanelполучают текущее значение активного таба неявно через React контекст. Явно значение не передаётся в каждый компонент.onChangeобъявлен только на компонентеTabList, компонентыTabнеявно получают его из контекста.
Ещё по теме: