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

React Router报错:[PrivateRoute]不是<Route>组件问题求助

解决react-router-dom中PrivateRoute的报错问题

错误原因

react-router-dom v6 对<Routes>的直接子组件有严格限制,必须是<Route>或<React.Fragment>。你之前的写法将自定义的<PrivateRoute>直接作为<Routes>的子组件,不符合v6的路由规则,因此触发报错。

修改方案

1. 重构PrivateRoute组件

将PrivateRoute改为接收需要保护的组件作为element属性,根据用户登录状态返回目标组件或跳转至登录页:

import { Navigate } from "react-router-dom"
import { useContext } from "react"
import AuthContext from "../context/AuthContext"

const PrivateRoute = ({ element }) => {
    const { user } = useContext(AuthContext)
    // 已登录则渲染目标组件,未登录则跳转至登录页(replace避免回退到登录页)
    return user ? element : <Navigate to="/login" replace />
}

export default PrivateRoute

2. 修改App.js中的路由使用方式

将PrivateRoute作为<Route>的element属性值传入,而不是直接作为<Routes>的子组件:

import React from 'react'
import {BrowserRouter as Router, Route, Routes} from "react-router-dom"
import { AuthProvider } from './context/AuthContext'
import './app.css'
import Dashboard from './views/Dashboard'
import PrivateRoute from "./utils/PrivateRoute"
import Home from './Components/Home/Home'
import Main from './Components/Main/Main'
import Navbar from './Components/Navbar/Navbar'
import Footer from './Components/Footer/Footer'
import Loginpage from './views/Loginpage'

const App = () => {
  return (
    <Router>
      <AuthProvider>
        <Navbar/>
        <Routes>
          {/* 用PrivateRoute包裹Dashboard组件,作为Route的element */}
          <Route path="/dashboard" element={<PrivateRoute element={<Dashboard />} />} />
          <Route path="/login" element={<Loginpage/>}/>
        </Routes>
        <Home/>
        <Main/>
        <Footer/>
     </AuthProvider>
    </Router>
  )
}

export default App

补充说明

这种写法完全符合react-router-dom v6的路由规范,<Routes>的直接子组件都是<Route>,而PrivateRoute作为路由元素的包装组件,负责处理登录状态的校验与跳转逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:57:27