HOC (Higher-Order Component) — это функция, которая принимает компонент и возвращает новый компонент с расширенным функционалом. В контексте React Router HOC активно используется для управления доступом к маршрутам, передачи дополнительных пропсов или оборачивания маршрутов в определённую логику, например, авторизации или логирования.
HOC позволяет создавать обертку вокруг компонента маршрута, чтобы внедрять повторяющуюся логику без дублирования кода. Пример типичных сценариев:
Рассмотрим базовый пример, который проверяет авторизацию перед доступом к компоненту:
import React from "react";
import { Navigate } from "react-router-dom";
const withAuth = (Component, isAuthenticated) => {
return props => {
if (!isAuthenticated) {
return ;
}
return ;
};
};
export default withAuth;
Пояснение ключевых моментов:
withAuth принимает два параметра: компонент
Component и флаг isAuthenticated.if (!isAuthenticated) и при необходимости перенаправляет
пользователя на страницу логина через
.{...props}.Подключение HOC к маршрутам выполняется при определении маршрутов:
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Dashboard from "./Dashboard";
import Login from "./Login";
import withAuth from "./withAuth";
const isAuthenticated = false; // пример состояния авторизации
function App() {
return (
} />
);
}
export default App;
Особенности:
element маршрута может быть компонентом, обернутым
HOC.Иногда требуется передавать дополнительные пропсы в обернутый компонент:
const withExtraProps = (Component, extraProps) => {
return props => ;
};
// Использование
extraProps добавляются к существующим пропсам
маршрута.В проектах часто требуется применять несколько оберток:
const enhance = Component => withAuth(withExtraProps(Component, { theme: "dark" }), isAuthenticated);
Замечания:
const composeHOCs = (...hocs) => Component =>
hocs.reduceRight((acc, hoc) => hoc(acc), Component);
Применение:
const enhance = composeHOCs(
Component => withAuth(Component, isAuthenticated),
Component => withExtraProps(Component, { theme: "dark" })
);
HOC для маршрутов удобно сочетать с React Context, например, для передачи данных о пользователе:
import { UserContext } from "./UserContext";
const withUser = Component => {
return props => (
{user => }
);
};
// Использование
useContext внутри каждой страницы.Outlet и ProtectedRoute, но HOC удобен, когда
нужно комбинировать несколько функциональностей.