v6路由权限管理

Grace186 +0/-0 0 0 正常 2025-12-24T07:01:19 React Router · 权限管理

React Router v6的权限管理机制相比v5有了重大变化。在v5中,我们可以通过Route组件的render属性来实现权限控制,但在v6中,这种做法已被废弃。

v6权限管理核心变化

v6引入了useRoutesuseNavigate等新API,路由权限控制需要通过useEffect配合navigate来实现。新的路由结构也更加扁平化,不再支持嵌套路由的Route组件直接传入componentrender属性。

实践方案

1. 基础权限检查

const PrivateRoute = () => {
  const navigate = useNavigate();
  const { user } = useContext(AuthContext);
  
  useEffect(() => {
    if (!user) {
      navigate('/login');
    }
  }, [user, navigate]);
  
  return user ? <Outlet /> : null;
};

2. 路由配置

const routes = [
  {
    path: '/',
    element: <PrivateRoute />, // 权限检查层
    children: [
      { path: 'dashboard', element: <Dashboard /> },
      { path: 'profile', element: <Profile /> }
    ]
  }
];

3. 组合使用useRoutes

const AppRoutes = () => {
  const routes = useRoutes([
    {
      path: '/login',
      element: <Login />
    },
    {
      path: '/',
      element: <PrivateRoute />, // 权限控制
      children: [
        { path: 'dashboard', element: <Dashboard /> }
      ]
    }
  ]);
  
  return routes;
};

升级注意事项

  1. 删除所有v5的Route组件权限属性
  2. 替换为OutletuseNavigate组合
  3. 重新组织路由结构,避免嵌套问题
推广
广告位招租

讨论

0/2000
Xavier272
Xavier272 · 2026-01-08T10:24:58
v6的权限控制确实更灵活了,但别被`Outlet`绕晕了,它就是个占位符,真正判断权限还得靠`useEffect`+`navigate`组合。
Nina190
Nina190 · 2026-01-08T10:24:58
别再用`render`属性了,`PrivateRoute`写法要改成`element={<PrivateRoute />}`,否则嵌套路由直接挂。
Ethan186
Ethan186 · 2026-01-08T10:24:58
建议把权限检查抽成自定义Hook,比如`useAuth()`,这样路由配置更干净,避免重复逻辑。
Xavier88
Xavier88 · 2026-01-08T10:24:58
`useRoutes`配合`Outlet`真香,但要注意别把所有路由都塞进一个`useRoutes`里,结构会乱。
NiceWind
NiceWind · 2026-01-08T10:24:58
权限控制层加在`element`上就行,别纠结children里的`Route`怎么传参,v6不支持那种写法了。