props.children и композиция

Разбираем особый проп children и принцип композиции — то, как из мелких компонентов собирают крупные.

props.children — содержимое, которое вы помещаете между открывающим и закрывающим тегами компонента.

Проблема: компонент-обёртка

Допустим, нужна карточка с рамкой и тенью. Внутри — что угодно: текст, картинка, кнопки. Жёстко прописать содержимое нельзя, ведь оно разное. Решение — проп children:

function Card({ children }) {
  return <div className="card">{children}</div>;
}

Теперь Card просто оборачивает то, что вы положите внутрь:

<Card>
  <h2>Заголовок</h2>
  <p>Произвольный текст внутри карточки.</p>
</Card>

Всё, что между <Card> и </Card>, React передаёт в props.children, а компонент рендерит это в нужном месте.

Композиция вместо наследования

В классическом ООП код переиспользуют через наследование. React идёт другим путём — композицией: сложные компоненты собираются из простых, как из деталей конструктора.

function Avatar({ src }) {
  return <img className="avatar" src={src} alt="" />;
}

function UserBadge({ name, avatar }) {
  return (
    <div className="badge">
      <Avatar src={avatar} />
      <span>{name}</span>
    </div>
  );
}

function Header() {
  return (
    <header>
      <UserBadge name="Аня" avatar="/anya.png" />
    </header>
  );
}

Avatar ничего не знает о UserBadge, а тот — о Header. Каждый делает одно дело и переиспользуется в разных местах. Это делает код понятным и легко изменяемым.

children + другие пропсы

children отлично уживается с обычными пропсами. Сделаем диалоговое окно с заголовком и произвольным телом:

function Dialog({ title, children }) {
  return (
    <div className="dialog">
      <h3>{title}</h3>
      <div className="body">{children}</div>
    </div>
  );
}

<Dialog title="Подтверждение">
  <p>Точно удалить файл?</p>
  <button>Да</button>
</Dialog>

Когда что использовать

НужноИнструмент
Передать значение (имя, цену, флаг)обычный проп
Передать произвольную вложенную разметкуchildren
Собрать большой UI из мелкихкомпозиция компонентов

Итог

  • props.children — это содержимое между тегами компонента; так делают универсальные обёртки.
  • React предпочитает композицию: крупные компоненты собираются из мелких.
  • children свободно сочетается с обычными пропсами.
Проверьте себя
1. Что попадает в props.children?
AВсе дочерние компоненты в проекте
BСодержимое между открывающим и закрывающим тегами компонента
CСписок пропсов родителя
DСостояние компонента
2. Какой подход React предпочитает для переиспользования кода?
AНаследование классов
BКомпозицию: сборку крупных компонентов из мелких
CКопирование кода между файлами
DГлобальные переменные
3. Можно ли использовать children вместе с обычными пропсами?
AНет, только что-то одно
BДа, children — это просто ещё один проп
CМожно, но только в классовых компонентах
DТолько если children идёт первым
Поддержать проект