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

如何通过React Router DOM拆分路由以精简App.jsx文件?

React Router 路由拆分实现方案

解决<Routes>内只能包含<Route>组件的报错问题,实现路由拆分以精简App.jsx文件。

报错原因

react-router-dom的<Routes>组件仅允许直接嵌套<Route>或<React.Fragment>,无法直接放置自定义组件,因此需要调整拆分方式,让自定义路由组件返回合法的路由结构。

具体实现步骤

1. 抽离公共路由到 PublicRoutes.jsx

创建单独的公共路由组件,返回所有公开访问的路由:

import { Route } from 'react-router-dom';
import Landing from './Landing';
import Support from './Support';
import Apply from './Apply';
import About from './About';
import Login from './Login';

export default function PublicRoutes() {
  return (
    <>
      <Route path="/" element={<Landing />} />
      <Route path="/support" element={<Support />} />
      <Route path="/apply" element={<Apply />} />
      <Route path="/about" element={<About />} />
      <Route path="/login" element={<Login />} />
    </>
  );
}

2. 抽离后台路由到 AdminRoutes.jsx

创建后台路由组件,接收鉴权状态isAuthenticated,返回需要权限验证的路由:

import { Route } from 'react-router-dom';
import PrivateRoute from './PrivateRoute';
import AdminLayout from './AdminLayout';
import Dashboard from './Dashboard';
import Tickets from './Tickets';
import Orders from './Orders';

export default function AdminRoutes({ isAuthenticated }) {
  return (
    <>
      <Route
        path="/admin/dashboard"
        element={
          <PrivateRoute isAuthenticated={isAuthenticated}>
            <AdminLayout>
              <Dashboard />
            </AdminLayout>
          </PrivateRoute>
        }
      />
      <Route
        path="/admin/tickets"
        element={
          <PrivateRoute isAuthenticated={isAuthenticated}>
            <AdminLayout>
              <Tickets />
            </AdminLayout>
          </PrivateRoute>
        }
      />
      <Route
        path="/admin/orders"
        element={
          <PrivateRoute isAuthenticated={isAuthenticated}>
            <AdminLayout>
              <Orders />
            </AdminLayout>
          </PrivateRoute>
        }
      />
    </>
  );
}

3. 简化 App.jsx

引入拆分后的路由组件,直接放置在<Routes>中:

import { Router, Routes } from 'react-router-dom';
import userTokenStore from './userTokenStore';
import PublicRoutes from './PublicRoutes';
import AdminRoutes from './AdminRoutes';

function App() {
  const isAuthenticated = userTokenStore((state) => state.isLoggedIn);

  return (
    <Router>
      <Routes>
        <PublicRoutes />
        <AdminRoutes isAuthenticated={isAuthenticated} />
      </Routes>
    </Router>
  );
}

export default App;

可选优化:用嵌套路由精简后台路由

如果后台路由有统一布局,可以用嵌套路由进一步简化结构:

修改 AdminRoutes.jsx:

import { Route } from 'react-router-dom';
import PrivateRoute from './PrivateRoute';
import AdminLayout from './AdminLayout';
import Dashboard from './Dashboard';
import Tickets from './Tickets';
import Orders from './Orders';

export default function AdminRoutes({ isAuthenticated }) {
  return (
    <Route
      path="/admin"
      element={
        <PrivateRoute isAuthenticated={isAuthenticated}>
          <AdminLayout />
        </PrivateRoute>
      }
    >
      <Route index element={<Dashboard />} />
      <Route path="tickets" element={<Tickets />} />
      <Route path="orders" element={<Orders />} />
    </Route>
  );
}

同时确保 AdminLayout 包含<Outlet>组件,用于渲染子路由内容:

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

export default function AdminLayout() {
  return (
    <div className="admin-layout">
      {/* 后台公共导航/侧边栏 */}
      <Outlet /> {/* 子路由页面会在这里渲染 */}
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:47:16