Приведи пример написания кастомного HOC

Ответ

Кастомный HOC (Higher-Order Component) — это функция, которая принимает компонент и возвращает новый компонент с дополнительной логикой. Пример:

import React from 'react';

const withLogger = (WrappedComponent) => {
  return class extends React.Component {
    componentDidMount() {
      console.log(`Component ${WrappedComponent.name} mounted`);
    }

    render() {
      return <WrappedComponent {...this.props} />;
    }
  };
};

// Использование
const MyComponent = ({ text }) => <div>{text}</div>;
const MyComponentWithLogger = withLogger(MyComponent);

HOC добавляет логирование при монтировании компонента. Ключевые моменты:

  1. Принимает компонент (WrappedComponent)
  2. Возвращает новый компонент (обычно классовый)
  3. Прокидывает пропсы через {...this.props}
  4. Может добавлять любую дополнительную логику (жизненный цикл, контекст и т.д.)

Ответ 18+ 🔞

А, ну вот, опять эти ваши HOC'и, блядь! Слушай, сейчас объясню, как ёжику в тумане, только понятнее будет, ёпта.

Представь себе, ты пишешь компонент. Простой, как три копейки. <MyComponent text="Привет" />. И всё у него хорошо, но вдруг начальство говорит: «А добавь-ка логирование, когда этот кусок кода на страницу встаёт!». И ты такой: «Ну окей, ща в каждый компонент буду componentDidMount пихать? Да это ж пиздец какой-то, копипаста на овердохуища!».

Вот тут-то и выходит на сцену наш герой — кастомный HOC, или, по-русски, компонент высшего порядка. Это не бог весть какая магия, а просто функция, сука! Функция, которая берёт твой голый, ни в чём не повинный компонент, заворачивает его в свою логику и отдаёт тебе обратно уже упакованным.

Как это выглядит в жизни, блядь? Смотри:

import React from 'react';

// Вот она, наша фабрика по обёртыванию компонентов. Называется withLogger.
const withLogger = (WrappedComponent) => { // Принимает она твой голый компонент.
  return class extends React.Component { // И возвращает НОВЫЙ, классовый компонент.
    componentDidMount() {
      // А сюда уже пихает любую свою, ебучую, логику.
      console.log(`Компонент ${WrappedComponent.name} примонтировался, ёпта!`);
    }

    render() {
      // А тут он твой исходный компонент рендерит, не забыв все пропсы ему передать.
      return <WrappedComponent {...this.props} />;
    }
  };
};

И как этим пользоваться? Да элементарно, ваще!

// Был у тебя голый компонент...
const MyComponent = ({ text }) => <div>{text}</div>;

// Стал у тебя компонент в шубе из логирования!
const MyComponentWithLogger = withLogger(MyComponent);

Теперь, когда <MyComponentWithLogger text="Всем чмоки в этом чате!" /> появится на странице, в консоли сразу: «Компонент MyComponent примонтировался, ёпта!». Красота, блядь!

Суть в чём, в рот меня чих-пых:

  1. Принимает компонент (этот самый WrappedComponent).
  2. Возвращает новый компонент (чаще всего классовый, чтобы к жизненному циклу прицепиться).
  3. Пропсы прокидывает через {...this.props} — это святое, не забывай, а то твой обёрнутый компонент оголодает.
  4. Может навешивать любую хуйню: подписки на контекст, инжектить пропсы, логировать, считать рендеры — да что угодно, фантазия ебать ограничена!

Вот и вся философия. Не боги горшки оборачивают, а функции — компоненты. Понял да?