当前位置:首页 > React

react如何做全局路由拦截

2026-01-25 19:18:37React

在React中实现全局路由拦截通常需要结合路由库(如React Router)和状态管理工具。以下是几种常见方法:

使用React Router的Navigate组件

在React Router v6中,可以通过Navigate组件和useNavigate钩子实现路由拦截。创建一个高阶组件包裹需要保护的路由:

react如何做全局路由拦截

import { Navigate, useLocation } from 'react-router-dom';

const PrivateRoute = ({ children }) => {
  const location = useLocation();
  const isAuthenticated = checkAuth(); // 自定义认证逻辑

  return isAuthenticated 
    ? children 
    : <Navigate to="/login" state={{ from: location }} replace />;
};

// 使用方式
<Route path="/protected" element={<PrivateRoute><ProtectedPage /></PrivateRoute>} />

使用路由守卫组件

创建一个路由守卫组件统一处理所有路由跳转:

import { Routes, Route, useLocation, Navigate } from 'react-router-dom';

const RouterGuard = ({ children }) => {
  const location = useLocation();
  const authRoutes = ['/dashboard', '/profile'];

  if (authRoutes.includes(location.pathname) && !isLoggedIn()) {
    return <Navigate to="/login" state={{ from: location }} replace />;
  }

  return children;
};

// 在根组件中使用
<RouterGuard>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/dashboard" element={<Dashboard />} />
  </Routes>
</RouterGuard>

使用自定义history对象

通过创建自定义history对象实现全局控制:

react如何做全局路由拦截

import { createBrowserHistory } from 'history';

const history = createBrowserHistory();

history.listen((location, action) => {
  if (requiresAuth(location.pathname) && !isAuthenticated()) {
    history.push('/login', { from: location });
  }
});

// 在Router中使用
<Router location={history.location} navigator={history}>
  {/* routes */}
</Router>

结合Context API

对于需要深度集成的场景,可以结合Context管理路由状态:

const AuthContext = createContext();

const AuthProvider = ({ children }) => {
  const [user, setUser] = useState(null);

  const checkAccess = (path) => {
    if (path.startsWith('/admin') && !user?.isAdmin) {
      return false;
    }
    return true;
  };

  return (
    <AuthContext.Provider value={{ user, checkAccess }}>
      {children}
    </AuthContext.Provider>
  );
};

// 在组件中使用useContext(AuthContext)获取状态

路由配置集中管理

通过集中式路由配置实现统一拦截:

const routes = [
  {
    path: '/',
    element: <Home />,
    public: true
  },
  {
    path: '/admin',
    element: <Admin />,
    middleware: [authMiddleware, adminMiddleware]
  }
];

const renderRoutes = (routes) => (
  <Routes>
    {routes.map((route) => (
      <Route 
        key={route.path}
        path={route.path}
        element={<MiddlewareWrapper route={route} />}
      />
    ))}
  </Routes>
);

每种方法适用于不同场景,简单项目可使用高阶组件方案,复杂项目建议采用集中路由配置或自定义history方案。注意在拦截时保留原始路由状态以便登录后重定向。

标签: 路由全局
分享给朋友:

相关文章

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue 路由通常通过 Vue Router 实现,它是 Vue.js 官方的路由管理器,用于构建单页应用(SPA)。以下是具体实现步骤: 安装 Vue Router 通过 np…

vue路由实现

vue路由实现

Vue 路由实现方法 安装 Vue Router 在项目中安装 Vue Router 依赖包: npm install vue-router 配置路由 在 src 目录下创建 router/inde…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERV…

vue路由实现介绍

vue路由实现介绍

Vue 路由基础概念 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。它通过动态映射 URL 到组件,实现无刷新页面切换。核心功能包括: 嵌套路由:支持多…

Vue实现路由监

Vue实现路由监

Vue 实现路由监听的方法 在 Vue 中可以通过多种方式实现路由监听,以下是常见的几种方法: 使用 watch 监听 $route 对象 通过 Vue 的 watch 功能可以监听 $route…

react路由如何刷新

react路由如何刷新

React 路由刷新方法 在 React 中,路由刷新通常涉及以下几种场景和解决方案: 强制重新加载当前页面 使用 window.location.reload() 可以强制刷新整个页面,但会丢失…