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

如何使用React-Router v4实现头部与侧边栏?(新手求助)

嘿,作为React Router v4的新手,想要搞定头部(Header)和侧边栏(Sidebar)的布局其实没那么复杂!核心思路就是把这俩组件做成全局共享的布局容器,让路由匹配的页面内容在它们的中间区域渲染。我给你一步步拆解实现步骤,附带代码示例:

1. 先写全局布局组件(Layout)

首先咱们创建一个Layout.js,把Header、Sidebar和主内容区域整合在一起。主内容区用来渲染当前匹配的路由页面,React Router v4里在布局组件内部嵌套<Route>会更灵活。

// Layout.js
import React from 'react';
import { NavLink, Route, Switch } from 'react-router-dom';
import Home from './Home';
import About from './About';
import './Layout.css';

const Layout = () => {
  return (
    <div className="layout-container">
      {/* 头部组件 */}
      <header className="header">
        <h1>我的React Router应用</h1>
      </header>
      
      <div className="content-wrapper">
        {/* 侧边栏导航 */}
        <aside className="sidebar">
          <nav>
            <NavLink 
              exact 
              to="/" 
              activeClassName="active-link"
            >
              首页
            </NavLink>
            <NavLink 
              to="/about" 
              activeClassName="active-link"
            >
              关于我们
            </NavLink>
          </nav>
        </aside>
        
        {/* 主内容区:渲染匹配的路由页面 */}
        <main className="main-content">
          <Switch>
            <Route exact path="/" component={Home} />
            <Route path="/about" component={About} />
          </Switch>
        </main>
      </div>
    </div>
  );
};

export default Layout;
2. 配置根路由(App.js)

接下来在根组件里,把Layout作为顶层路由的组件,这样所有访问的页面都会套上这个布局:

// App.js
import React from 'react';
import { BrowserRouter as Router } from 'react-router-dom';
import Layout from './Layout';

function App() {
  return (
    <Router>
      <Layout />
    </Router>
  );
}

export default App;
3. 添加上基础样式(Layout.css)

为了让布局正常显示,咱们加一点CSS来控制排版:

/* Layout.css */
.layout-container {
  display: flex;
  flex-direction: column;
  height: 100vh;
  margin: 0;
  padding: 0;
}

.header {
  background-color: #2c3e50;
  color: white;
  padding: 1rem 2rem;
  margin: 0;
}

.content-wrapper {
  display: flex;
  flex: 1;
  overflow: hidden;
}

.sidebar {
  width: 200px;
  background-color: #34495e;
  padding: 1.5rem;
}

.sidebar nav {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.sidebar a {
  color: white;
  text-decoration: none;
  padding: 0.5rem;
  border-radius: 4px;
}

.sidebar a.active-link {
  background-color: #2980b9;
}

.main-content {
  flex: 1;
  padding: 2rem;
  overflow-y: auto;
}
4. 简单写两个页面组件示例

比如Home.js和About.js:

// Home.js
import React from 'react';

const Home = () => {
  return <h2>欢迎来到首页!</h2>;
};

export default Home;
// About.js
import React from 'react';

const About = () => {
  return (
    <div>
      <h2>关于我们</h2>
      <p>这是一个React Router v4的布局示例</p>
    </div>
  );
};

export default About;
一些额外小提示
  • 如果有某些页面不需要头部或侧边栏(比如登录页),可以直接在App.js的<Router>里单独写<Route>,不用嵌套在Layout里:
    <Router>
      <Route path="/login" component={Login} />
      <Route path="/" component={Layout} />
    </Router>
    
  • <NavLink>的exact属性很重要,不然访问/about时,/的链接也会被标记为激活状态。
  • <Switch>组件会确保只有第一个匹配的路由被渲染,避免多个路由同时显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:22:52