React Academy · Урок

Компоненты высшего порядка (HOC)

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

Урок 2 из 413 шагов

«Компоненты высшего порядка (HOC)» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке Вы поймёте, что такое компоненты высшего порядка (HOC), научитесь их создавать, разберёте распространённые варианты использования и их компромиссы по сравнению с хуками.

Что такое HOC

Компонент высшего порядка — это функция, которая принимает компонент в качестве входных данных и возвращает новый, расширенный компонент. HOC добавляет поведение (например, пропы, проверки авторизации или журналирование), не изменяя исходный компонент.
// HOC signature
function withEnhancement(WrappedComponent) {
  return function Enhanced(props) {
    // add behaviour here
    return <WrappedComponent {...props} extraProp="value" />;
  };
}

HOC для защиты авторизации

Распространённый HOC перенаправляет неавторизованных пользователей на страницу входа. Исходному компоненту не нужно знать о логике авторизации.
function withAuth(Component) {
  return function AuthGuard(props) {
    const isLoggedIn = useAuth();
    if (!isLoggedIn) return <Navigate to="/login" />;
    return <Component {...props} />;
  };
}

const ProtectedPage = withAuth(DashboardPage);

HOC для журналирования

HOC может записывать в журнал каждое отображение, включая имя компонента и пропы, чтобы упростить отладку. Оберните любой компонент с помощью withLogger, чтобы добавить трассировку.
function withLogger(Component) {
  return function Logged(props) {
    console.log('[render]', Component.displayName, props);
    return <Component {...props} />;
  };
}

Передача пропов дальше

Всегда передавайте все полученные пропы обёрнутому компоненту с помощью `{...props}`. Если этого не сделать, API исходного компонента перестанет работать.
return function HOC(props) {
  return <WrappedComponent {...props} injectedProp={value} />;
};

Настройка displayName

Компоненты, возвращаемые HOC, теряют своё имя в React DevTools. Установите содержательное значение displayName, чтобы можно было определить их в дереве компонентов.
function withAuth(Component) {
  function AuthGuard(props) { /* ... */ }
  AuthGuard.displayName = 'withAuth(' + (Component.displayName || Component.name) + ')';
  return AuthGuard;
}

Передача ссылок

По умолчанию HOC блокируют ссылки. Используйте `React.forwardRef` внутри HOC, чтобы передать ссылки обёрнутому компоненту.
function withStyle(Component) {
  return React.forwardRef(function (props, ref) {
    return <Component ref={ref} {...props} className="styled" />;
  });
}

HOC, рендер-пропы и хуки

Компоненты высшего порядка внедряют пропы и могут защищать маршруты. Рендер-пропы передают динамический интерфейс. Пользовательские хуки извлекают логику. В современном React предпочтение отдаётся хукам, поскольку они не создают ад обёрток и их проще компоновать. HOC полезны для классовых компонентов или интеграций со сторонними библиотеками.

Ад обёрток

Применение множества HOC создаёт глубокую вложенность в дереве компонентов: `withTheme(withAuth(withLogger(MyPage)))`. DevTools показывает множество анонимных слоёв-обёрток. Хуки полностью устраняют эту проблему.

HOC в реальных библиотеках

`connect()` из Redux, `withRouter()` из React Router v5 и `observer()` из MobX — всё это HOC. Понимание HOC помогает работать со старыми API этих библиотек.

Быстрая проверка

Что компонент высшего порядка всегда должен делать с полученными пропами?

Итоги

Компоненты высшего порядка — это функции, которые принимают компонент и возвращают расширенный компонент. Они внедряют пропы, защищают маршруты и добавляют журналирование. Всегда передавайте пропы, устанавливайте displayName и передавайте ссылки. В современном React отдавайте предпочтение хукам.

Далее

Следующий урок: **HOC, рендер-пропы и пользовательские хуки** — Вы сравните три стратегии совместного использования кода по удобству чтения, тестированию и композиции.
Можно начать бесплатно

Изучай React с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
88
Уроки
324

Часто задаваемые вопросы

Урок «Компоненты высшего порядка (HOC)» бесплатный?

Да — полный текст урока «Компоненты высшего порядка (HOC)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Компоненты высшего порядка (HOC)»?

Оборачивайте компоненты, чтобы добавлять свойства, защищать маршруты или добавлять журналирование через фабрики HOC. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Компоненты высшего порядка (HOC)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Паттерн Render Props
  2. Компоненты высшего порядка (HOC)
  3. HOC, Render Props или пользовательские хуки
  4. Рефакторинг HOC в пользовательский хук
← Назад к React Academy