PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Что такое компонент высшего порядка?

Компоненты

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

Форма

const withLoading = (Component) => {
  return function WithLoading({ isLoading, ...props }) {
    if (isLoading) return <Spinner />;
    return <Component {...props} />;
  };
};

const UserList = withLoading(UserListInner);
// <UserList isLoading={loading} users={users} />

HOC не меняет исходный компонент — оборачивает: добавляет props, условный рендеринг, подписки, логирование.

Известные примеры

  • connect(mapStateToProps) из react-redux;
  • React.memo — тоже HOC: принимает компонент, возвращает мемоизированный;
  • withTranslation (i18next), withRouter (старый React Router).

Правила и подводные камни

  • Пробрасывать props ({...props}) и ref (до React 19 — через forwardRef; в React 19 ref приходит обычным пропом и пробрасывается вместе с {...props}), задавать displayName для отладки.
  • Не создавать HOC внутри рендера: результат вызова — новый тип компонента, React будет пересоздавать поддерево каждый рендер.
  • Композиция нескольких HOC читается тяжело: withAuth(withTheme(withLogger(Page))) — «обёрточный ад».

HOC сегодня

Хуки закрыли большинство сценариев проще: useAuth() вместо withAuth. HOC остаётся уместным, когда нужно управлять самим рендерингом обёрнутого компонента (подменить его целиком, обернуть провайдером/ErrorBoundary) или добавить поведение чужому компоненту без изменения его кода.

Коротко для собеседования

HOC — функция «компонент → компонент» для переиспользования поведения через обёртку (connect, React.memo). Правила: пробрасывать props, не создавать в рендере. После хуков используется реже — в основном там, где надо контролировать сам рендеринг или расширять чужие компоненты.

Другие вопросы раздела