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

如何将React Router Dom的Routes作为Props传递给组件并实现布局?

布局需求与解决方案

需求说明

  • 侧边导航固定,占页面20%宽度
  • 剩余80%区域顶部为固定头部导航
  • 点击头部导航链接时,头部下方的路由内容实现动态切换

期望布局示意图:

____-----------------------
|  |    Header Nav        |
|s |-----------------------
|i |       Dynamic        |
|d |     Routes Content   |
|e |                      |
|Na|                      |
|v |                      |

现有代码问题

你提供的代码存在两个核心问题:

  1. MainNavigation中props.childern是拼写错误,应为props.children,否则路由内容无法正常渲染
  2. 缺少布局样式,无法实现侧边栏固定、宽度分配以及头部固定的效果

原有代码

App.js

<Router>
  <main>
    <MainNavigation>
      <Routes>
        <Route path="/sessions/upcoming" element={<Sessions />} />
        <Route path="/sessions/past" element={<Sessions />} />
      </Routes>
    </MainNavigation>
  </main>
</Router>

MainNavigation.js

const MainNavigation = (props) => {
  return (
    <div>
      <SideNav />   // 第一列侧边导航,占页面20%宽度
      <HeaderNav /> // 第二列第一行,占页面80%宽度的头部导航
      {props.childern} // 第二列第二行,占页面80%宽度的内容区域
    </div>
  );
};

修正与实现方案

1. 修正Props拼写错误

将MainNavigation中的props.childern改为props.children,确保路由内容能正确传入并渲染。

2. 用CSS实现目标布局

推荐使用Flexbox或Grid布局来实现,以下是两种可行方案:

方案一:Flexbox布局

MainNavigation.js

import './MainNavigation.css';

const MainNavigation = (props) => {
  return (
    <div className="main-nav-container">
      <SideNav className="side-nav" />
      <div className="right-container">
        <HeaderNav className="header-nav" />
        <div className="content-area">
          {props.children}
        </div>
      </div>
    </div>
  );
};

MainNavigation.css

/* 主容器:全屏高度的flex布局 */
.main-nav-container {
  display: flex;
  height: 100vh;
}

/* 侧边导航:固定20%宽度,滚动时保持固定 */
.side-nav {
  width: 20%;
  position: sticky;
  top: 0;
  height: 100vh;
  background-color: #f5f5f5;
}

/* 右侧容器:占剩余80%宽度,垂直flex排列 */
.right-container {
  width: 80%;
  display: flex;
  flex-direction: column;
}

/* 头部导航:固定在顶部 */
.header-nav {
  position: sticky;
  top: 0;
  background-color: #fff;
  padding: 1rem;
  border-bottom: 1px solid #eee;
}

/* 内容区域:自动填充剩余空间,超出可滚动 */
.content-area {
  flex: 1;
  overflow-y: auto;
  padding: 1.5rem;
}

方案二:Grid布局(更直观的区域划分)

MainNavigation.css

.main-nav-container {
  display: grid;
  grid-template-columns: 20% 80%; /* 两列宽度分配 */
  height: 100vh;
}

.side-nav {
  position: sticky;
  top: 0;
  height: 100vh;
  background-color: #f5f5f5;
}

.right-container {
  display: grid;
  grid-template-rows: auto 1fr; /* 头部自适应高度,内容占剩余空间 */
}

.header-nav {
  position: sticky;
  top: 0;
  background-color: #fff;
  padding: 1rem;
  border-bottom: 1px solid #eee;
}

.content-area {
  overflow-y: auto;
  padding: 1.5rem;
}

3. 确保路由跳转正常

HeaderNav中需使用react-router-dom的Link组件实现无刷新跳转:

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

const HeaderNav = () => {
  return (
    <nav>
      <Link to="/sessions/upcoming" style={{ marginRight: '1rem' }}>即将到来的会话</Link>
      <Link to="/sessions/past">过往会话</Link>
    </nav>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 05:00:53