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

React Router v6.2.2 后台管理页面私有路由创建报错求助

解决react-router-dom v6.2.2私有路由实现问题

错误原因

你的报错源于react-router-dom v6的核心规则:<Route>组件只能作为<Routes>的直接子元素使用,不能在自定义组件中直接渲染。而你原有的PrivateRouter组件直接返回了<Route>,违反了这一规则,导致报错。

正确实现方式

react-router-dom v6彻底改变了私有路由的实现逻辑,不再需要用<Route>封装权限判断,而是要做一个认证守卫组件,直接根据权限返回目标内容或重定向。

重构PrivateRouter组件

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

const PrivateRouter = ({ children }) => {
  const token = window.localStorage.getItem("userInfo");
  
  // 已登录则返回受保护的组件
  if (token) {
    return children;
  } 
  // 未登录则重定向到登录页
  else {
    return <Navigate to="/login" replace />;
  }
};

export default PrivateRouter;

修改App.js中的用法

保持原有路由结构不变,直接用PrivateRouter包裹需要保护的组件即可:

import { BrowserRouter, Routes, Route } from 'react-router-dom';
import PrivateRouter from './PrivateRouter';
import Dashboard from './Dashboard';
import Login from './Login';

function App() {
  return (
    <BrowserRouter>
      <Routes>
        {/* 公开登录路由 */}
        <Route path="/login" element={<Login />} />
        {/* 受保护的管理员仪表盘路由 */}
        <Route 
          path="/admin/dashboard" 
          element={
            <PrivateRouter>
              <Dashboard />
            </PrivateRouter>
          } 
        />
      </Routes>
    </BrowserRouter>
  );
}

export default App;

进阶:增加管理员权限校验

如果需要验证用户是否为管理员(而非仅登录状态),可以解析localStorage中的用户信息(假设是JSON格式字符串),判断角色权限:

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

const PrivateRouter = ({ children }) => {
  const userInfoStr = window.localStorage.getItem("userInfo");
  
  if (userInfoStr) {
    const userInfo = JSON.parse(userInfoStr);
    // 假设userInfo中包含role字段,值为'admin'表示管理员
    if (userInfo.role === 'admin') {
      return children;
    } 
    // 非管理员重定向到无权限页面
    else {
      return <Navigate to="/unauthorized" replace />;
    }
  } 
  // 未登录重定向到登录页
  else {
    return <Navigate to="/login" replace />;
  }
};

export default PrivateRouter;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:35:23