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

React Router v6报错:PrivateRoute非Route组件问题及代码修改咨询

解决React Router v6中PrivateRoute的路由报错问题

错误原因

React Router v6对<Routes>组件的子元素做了严格限制,只有<Route>或<React.Fragment>可以直接作为它的子组件。你之前自定义的<PrivateRoute>是普通组件,不符合这个要求,因此触发了报错。

重构方案一:将PrivateRoute改为权限包裹组件

把PrivateRoute改成用来包裹需要权限验证的页面元素,而非返回<Route>组件:

1. 重构PrivateRoute组件

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

// 接收children属性,验证通过则渲染子组件,否则跳转到登录页
const PrivateRoute = ({ children }) => {
  const hasToken = localStorage.getItem('token');
  return hasToken ? children : <Navigate to="/login" replace />;
};

2. 修改App组件的路由配置

注意:React Router v6已移除exact属性,默认路由匹配就是精确匹配,无需再添加;另外你原代码中导入Spreadsheet时存在笔误(写成了Spreadsheetester),需要修正:

import React from 'react';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import Login from './Login';
import Spreadsheet from './Spreadsheet';
import PrivateRoute from './PrivateRoute'; // 若PrivateRoute在同一文件则无需单独导入

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path="/login" element={<Login />} />
        {/* 用PrivateRoute包裹需要权限的页面组件 */}
        <Route 
          path="/" 
          element={
            <PrivateRoute>
              <Spreadsheet />
            </PrivateRoute>
          } 
        />
      </Routes>
    </Router>
  );
};

export default App;

重构方案二:使用useRoutes配置式路由

React Router v6提供了useRoutes钩子,可以用配置对象的方式定义路由,更简洁地处理权限逻辑:

import React from 'react';
import { BrowserRouter as Router, useRoutes, Navigate } from 'react-router-dom';
import Login from './Login';
import Spreadsheet from './Spreadsheet';

const AppRoutes = () => {
  const hasToken = localStorage.getItem('token');

  // 用数组配置所有路由规则
  return useRoutes([
    { path: '/login', element: <Login /> },
    { 
      path: '/', 
      element: hasToken ? <Spreadsheet /> : <Navigate to="/login" replace /> 
    },
    // 可选:添加404路由,匹配所有未定义的路径
    { path: '*', element: <Navigate to="/login" replace /> }
  ]);
};

const App = () => {
  return (
    <Router>
      <AppRoutes />
    </Router>
  );
};

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:42:28