如何将React Router Dom的Routes作为Props传递给组件并实现布局?
布局需求与解决方案
需求说明
- 侧边导航固定,占页面20%宽度
- 剩余80%区域顶部为固定头部导航
- 点击头部导航链接时,头部下方的路由内容实现动态切换
期望布局示意图:
____----------------------- | | Header Nav | |s |----------------------- |i | Dynamic | |d | Routes Content | |e | | |Na| | |v | |
现有代码问题
你提供的代码存在两个核心问题:
MainNavigation中props.childern是拼写错误,应为props.children,否则路由内容无法正常渲染- 缺少布局样式,无法实现侧边栏固定、宽度分配以及头部固定的效果
原有代码
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
相关产品推荐
相关产品推荐

