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

如何用React Router v6在同一页面并排渲染子路由实现三栏布局?

解决三栏布局的嵌套路由问题

你的问题核心是路由层级未正确嵌套,导致内栏与主内容互相替换。要实现侧边栏始终显示、内栏在进入/:state/:building后常驻、主内容在详情页叠加显示的三栏布局,需要调整路由嵌套结构并让内栏组件承载自身的Outlet。

步骤1:重构路由嵌套关系

将详情路由设为内栏路由的子路由,让内栏作为父容器,主内容作为它的子节点渲染:

const router = createBrowserRouter(createRoutesFromElements(
  <>
    <Route path='/login' element={<Login/>}/>
    <Route path='/register' element={<Register/>} errorElement={<Error/>}/>
    <Route path='/reset-password' element={<ResetPassword/>} />
    <Route element={<AuthWrapper/>}>
      <Route path='/' element={<Portal/>} loader={portalLoader}>
        {/* 内栏作为父路由,承载自身的Outlet */}
        <Route path='/:state/:building' element={<Innerbar/>} loader={innerbarLoader}>
          {/* 详情路由作为内栏的子路由,复用上层路径参数 */}
          <Route path=':clientId/details' element={<MainContent/>} loader={MainContentLoader}/>
        </Route>
      </Route>
    </Route>
    <Route path='*' element={<div>This route does not exist 404</div>}/>
  </>
))

步骤2:修改Innerbar组件,添加Outlet

在Innerbar内部加入Outlet,用来渲染主内容组件。这样访问详情页时,内栏不会被替换,而是与主内容并排展示:

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

function Innerbar() {
  // 保留原Innerbar的业务逻辑与UI代码

  return (
    <div style={{ display: 'flex', flex: 1, gap: '16px' }}>
      {/* 内栏自身的内容区域 */}
      <div className="innerbar-container">
        {/* 你的内栏UI元素 */}
      </div>
      {/* 主内容的渲染出口 */}
      <Outlet />
    </div>
  );
}

步骤3:确认Portal组件的布局逻辑

Portal组件中的Stack已包含侧边栏和Outlet,此时这个Outlet会渲染Innerbar组件(带它自己的Outlet),最终形成稳定的三栏结构:

  • 左侧:Portal内置的Sidebar
  • 中间:Innerbar的内容区域
  • 右侧:MainContent(通过Innerbar的Outlet渲染)

调整完成后,访问/:state/:building时显示侧边栏+内栏;访问/:state/:building/:clientId/details时,侧边栏与内栏保留,同时加载主内容,实现三栏共存的预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 05:00:36