Hack Frontend Community

Что такое HOC (Higher-Order Component) в React

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

Это паттерн переиспользования кода в React — он позволяет оборачивать базовые компоненты, расширяя их функциональность без изменения исходного кода.


Синтаксис

const withExtraLogic = (WrappedComponent) => {
  return function EnhancedComponent(props) {
    // Дополнительная логика
    return <WrappedComponent {...props} />;
  };
};

Пример HOC: логирование пропсов

function withLogger(WrappedComponent) {
  return function LoggerComponent(props) {
    console.log("Props:", props);
    return <WrappedComponent {...props} />;
  };
}

const Hello = ({ name }) => <h1>Привет, {name}</h1>;

const HelloWithLogger = withLogger(Hello);

// Использование
<HelloWithLogger name="Мир" />;

При каждом рендере вы увидите в консоли текущие пропсы, переданные в компонент.

Где применяются HOC

Часто используются для:

  • Авторизации (оборачивание компонентов, доступных только авторизованным)
  • Подключения к Redux (connect)
  • Оборачивания layout'ов (например, с темами, языками)
  • Добавления общих обработчиков или side-effect'ов

Важно помнить

  • HOC не изменяет переданный компонент, а создаёт новый
  • Всегда копируйте пропсы с помощью ...props, чтобы передать их дальше
  • HOC можно комбинировать, но важно не усложнять цепочку

Пример HOC с useEffect

function withFetch(WrappedComponent, url) {
  return function ComponentWithData(props) {
    const [data, setData] = useState(null);

    useEffect(() => {
      fetch(url)
        .then((res) => res.json())
        .then(setData);
    }, [url]);

    return <WrappedComponent {...props} data={data} />;
  };
}

Теперь любой компонент можно обернуть в withFetch, чтобы получить данные из API.

Вывод:

HOC — мощный способ переиспользовать логику между компонентами без дублирования кода. Он особенно полезен при написании кросс-компонентной функциональности: логгеры, защита маршрутов, обработка данных и т.п.