当前位置:首页 > React

react实现全局路由守卫

2026-01-27 17:57:39React

全局路由守卫的实现方法

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

使用React Router的Navigate组件

通过包装路由组件并在渲染前进行权限检查:

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

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

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

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

使用React Router v6的loader函数

在数据加载阶段进行拦截:

const router = createBrowserRouter([
  {
    path: '/',
    element: <Root />,
    loader: () => {
      if (!isLoggedIn()) {
        throw redirect('/login');
      }
      return null;
    }
  }
]);

自定义高阶组件(HOC)

创建可重用的路由守卫组件:

function withRouterGuard(WrappedComponent, checkFn) {
  return (props) => {
    const navigate = useNavigate();
    useEffect(() => {
      if (!checkFn()) {
        navigate('/fallback');
      }
    }, [navigate]);

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

使用上下文和自定义钩子

结合Context API实现全局状态管理:

const AuthContext = createContext();

const useAuth = () => {
  const { pathname } = useLocation();
  const { user } = useContext(AuthContext);

  useEffect(() => {
    if (!user && !['/login', '/register'].includes(pathname)) {
      window.location.href = '/login';
    }
  }, [pathname, user]);
};

路由配置集中管理

通过统一的路由配置文件实现守卫:

const routes = [
  {
    path: '/admin',
    component: AdminPage,
    guards: [authGuard, roleGuard('admin')]
  }
];

const resolvedRoutes = routes.map(route => ({
  ...route,
  element: route.guards.reduce(
    (acc, guard) => guard(acc),
    <route.component />
  )
}));

注意事项

  • 守卫逻辑应避免阻塞渲染过程
  • 需要处理路由跳转时的状态保存
  • 对于异步验证(如JWT校验)需添加加载状态
  • 服务端渲染场景需考虑SSR兼容性

以上方法可根据具体需求组合使用,React Router v6推荐使用loader方案或Navigate组件实现路由守卫。

react实现全局路由守卫

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

相关文章

动态路由的实现vue

动态路由的实现vue

动态路由的实现(Vue) 在Vue中实现动态路由通常涉及以下方法: 基于路由参数(params) 在路由配置中使用动态片段(以冒号开头),例如: const routes = [ { path…

vue 路由 实现

vue 路由 实现

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

php 路由实现

php 路由实现

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

uniapp如何写全局函数

uniapp如何写全局函数

全局函数的定义与使用 在UniApp中定义全局函数可以通过挂载到Vue.prototype或使用模块化导出导入的方式实现。以下是两种常用方法: 方法一:挂载到Vue.prototype 在main.…

Vue实现路由监

Vue实现路由监

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

react路由如何刷新

react路由如何刷新

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