【问题标题】:Error: [AdminRoute] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>错误:[AdminRoute] 不是 <Route> 组件。 <Routes> 的所有子组件必须是 <Route> 或 <React.Fragment>
【发布时间】:2026-01-07 16:45:01
【问题描述】:

由于我是新来的反应,如果用户未登录,我希望经过身份验证的路由页面不应访问,就像有人输入 url localhost.../admin/dashboard 他应该无法导航相反他应该如果未登录,将被带到登录页面。

我正在使用 react-router v6 并为我的应用程序创建私有路由。

AdminRoute.js 文件代码如下

import React from "react";
import { Route, Navigate} from 'react-router-dom';
import { isAuthenticated } from "../helper/auth";

//props component is assigned to Component
//...rest spreading props property but reassigning it to a variable called rest
const AdminRoute = ({ component: Component, ...rest }) => {
    return (
        <Route 
            {...rest}
            render={(props) => 
                isAuthenticated() && isAuthenticated().role === 1 ? (
                    <Component {...props} />
                ) : (
                    <Navigate to = '/signin' /> 
                )
            
            }
        
        
        />
    )
};

export default AdminRoute;

App.js 文件代码如下

import React from 'react';
import {BrowserRouter, Route, Routes} from 'react-router-dom';
import Header from './Header';
import Home from './Home';
import Signup from './Signup';
import Signin from './Signin';
import ForgotPassword from './forgot-password';
import UserDashboard from './UserDashboard';
import AdminDashboard from './AdminDashboard';
import ShowroomDashboard from './ShowroomDashboard';
import AdminRoute from './AdminRoute';

import NotFound from './NotFound';



const App = () => (<BrowserRouter>
      <Header />
      <main>
            <Routes>
              <Route exact path='/' element={<Home />} />
              <Route exact path='/signup' element={<Signup />} />
              <Route exact path='/signin' element={<Signin />} />
              <Route exact path='/forgotpassword' element={<ForgotPassword />} />
              <Route exact path='/user/dashboard' element={<UserDashboard />} />
              <AdminRoute exact path='/admin/dashboard' element={<AdminDashboard />} />
              <Route exact path='/showroom/dashboard' element={<ShowroomDashboard />} />
              <Route exact path = '*' element={<NotFound />} />
            </Routes>
      </main>
  </BrowserRouter>
  
);

export default App;

非常感谢任何帮助。 谢谢。

【问题讨论】:

    标签: reactjs react-router react-router-dom


    【解决方案1】:

    react-router-dom 不再支持自定义路由组件,现在更喜欢处理身份验证逻辑并呈现 children 属性或 Outlet 用于嵌套路由或重定向的组件包装器。

    包装单个“路由”组件:

    import React from "react";
    import { Navigate } from 'react-router-dom';
    import { isAuthenticated } from "../helper/auth";
    
    const AdminRoute = ({ children }) => {
      return isAuthenticated()?.role === 1 
        ? children
        : <Navigate to='/signin' replace />;
    };
    

    ...

    <Route
      path='/admin/dashboard'
      element={(
        <AuthRoute>
          <AdminDashboard />
        </AuthRoute>
      )}
    />
    

    包装嵌套的Route 组件:

    import React from "react";
    import { Navigate, Outlet } from 'react-router-dom';
    import { isAuthenticated } from "../helper/auth";
    
    const AdminWrapper = () => {
      return isAuthenticated()?.role === 1
        ? <Outlet />
        : <Navigate to='/signin' replace />;
    };
    

    ...

    <Route path='/admin/dashboard/*' element={<AdminWrapper />}>
      <Route index element={<AdminDashboard />} />
      ... any other '/admin/dashboard/*' routes ...
    </Route>
    

    【讨论】:

    • 谢谢@Drew。该代码对我有用
    最近更新 更多