You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Router v6:如何在权限校验组件中获取子路由permission属性?

更优的权限校验实现方案

你现在每个页面组件都调用hook的思路,会导致代码重复、组件和权限逻辑耦合度高,这里给你两个更简洁的优化方案:

方案一:封装带权限校验的路由组件(推荐)

把权限校验逻辑统一封装到一个路由组件里,页面组件完全不用关心权限相关代码,只专注业务逻辑。

步骤1:封装ProtectedRoute组件

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

// 假设你有获取当前用户权限的方法,比如从全局状态/localStorage读取
const getCurrentUserPermission = () => {
  return localStorage.getItem('userPermission') || '';
};

const ProtectedRoute = ({ requiredPermission }) => {
  const userPermission = getCurrentUserPermission();

  // 权限匹配逻辑,可根据需求扩展(比如支持多权限、角色组)
  if (userPermission === requiredPermission) {
    // 权限通过,渲染子路由内容
    return <Outlet />;
  }

  // 权限不通过,跳转到登录页或无权限页面
  return <Navigate to="/login" replace />;
};

步骤2:调整路由配置与渲染逻辑

先修正路由数组的字段错误(原route字段应改为path,否则route.path会报错):

const myRoutes = [
  { path: '/home', element: <Home />, permission: 'admin' },
  { path: '/about', element: <About />, permission: 'agent' },
];

然后修改路由渲染逻辑,用ProtectedRoute作为权限校验容器:

<Routes>
  {/* 公共路由直接放置,比如登录页 */}
  <Route path="/login" element={<Login />} />

  {/* 遍历生成带权限校验的路由 */}
  {myRoutes.map((route) => (
    <Route 
      key={route.path}
      element={<ProtectedRoute requiredPermission={route.permission} />}
    >
      <Route path={route.path} element={route.element} />
    </Route>
  ))}
</Routes>

这种方式把权限逻辑完全抽离到独立组件,后续修改权限规则只需要改动ProtectedRoute,所有页面组件无需调整。

方案二:用高阶组件包裹页面元素

如果不想额外封装路由组件,也可以用高阶组件直接包裹页面组件,统一注入权限校验:

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

const getCurrentUserPermission = () => {
  return localStorage.getItem('userPermission') || '';
};

// 权限校验高阶组件
const withPermissionCheck = (WrappedComponent, requiredPermission) => {
  return () => {
    const userPermission = getCurrentUserPermission();
    if (userPermission !== requiredPermission) {
      return <Navigate to="/login" replace />;
    }
    return <WrappedComponent />;
  };
};

// 修改路由数组,直接用高阶组件包裹页面元素
const myRoutes = [
  { path: '/home', element: withPermissionCheck(Home, 'admin') },
  { path: '/about', element: withPermissionCheck(About, 'agent') },
];

// 路由渲染逻辑
<Routes>
  <Route path="/login" element={<Login />} />
  {myRoutes.map((route) => (
    <Route key={route.path} path={route.path} element={route.element()} />
  ))}
</Routes>

这种方式也能实现逻辑统一,但相比封装路由组件,灵活性稍差,比如无法直接支持嵌套路由的权限校验。

关键注意点

React Router的Route组件不支持自定义permission属性,你原来给Route加permission={route.permission}的写法是无效的,不会被React Router处理,必须通过上述方式把权限逻辑和路由/页面组件绑定。

内容的提问来源于stack exchange,提问作者JunKim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 02:25:15