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

如何实现React侧边栏点击后在内容区加载对应组件的路由?

React侧边栏路由配置方案:实现内容区动态加载组件

要实现侧边栏点击后在Home的ContentArea加载对应组件,核心是使用React Router的嵌套路由+Outlet组件,结合Link跳转。以下是具体修改步骤:

1. 调整App.js的路由结构,配置Home的嵌套子路由

把Home路由设置为父路由,内部定义各个菜单项的子路由,子路由会自动渲染在Home的Outlet位置:

import { Routes, Route } from 'react-router-dom';
import LoginSignup from './LoginSignup';
import Home from './Home';
// 导入你的Item1、Item2、Item3组件
import Item1 from './Item1';
import Item2 from './Item2';
import Item3 from './Item3';

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<LoginSignup />} />
        {/* Home作为父路由,嵌套子路由 */}
        <Route path="/home" element={<Home />}>
          {/* 默认子路由:进入/home时默认显示的组件 */}
          <Route index element={<Item1 />} />
          {/* 各个菜单项的子路由 */}
          <Route path="item1" element={<Item1 />} />
          <Route path="item2" element={<Item2 />} />
          <Route path="item3" element={<Item3 />} />
        </Route>
      </Routes>
    </div>
  );
}

2. 修改Sidebar组件,用Link替换普通li实现跳转

导入React Router的Link组件,把菜单项改成Link,同时修复handleLogout的navigate使用问题:

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

const Sidebar = () => {
  const navigate = useNavigate();

  const handleLogout = () => {
    navigate('/');
  }

  return (
    <div className='sidebar-content-menu'>
      <ul className='menu-list'>
        <div>
          {/* 使用相对路径跳转,自动拼接父路由/home */}
          <li><Link to="item1">Item1</Link></li>
          <li><Link to="item2">Item2</Link></li>
          <li><Link to="item3">Item3</Link></li>
        </div>
        <div>
          <li onClick={handleLogout}>Logout</li>
        </div>
      </ul>
    </div>
  )
}

3. 修改Home组件,添加Outlet渲染子路由内容

导入Outlet组件,放在你指定的内容显示区域:

import { Outlet, useNavigate } from 'react-router-dom';
import Header from './Header';
import Sidebar from './Sidebar';

const Home = () => {
  const navigate = useNavigate();

  const handleLogout = () => {
    navigate('/');
  }

  return (
    <div className='home-container'>
      <div className='home-wrapper'>
        <div className='home-content'>
          <div className='home-content-side-menu-holder'>
            <h1>ZERO</h1>
            <div className='sidebar-content-menu'>
              <Sidebar />
            </div>
          </div>
          <div className='home-content-menu-content-section'>
            <Header />
            <div className='side-menu-content-section'>
              <div className='side-menu-content-viewer'>
                {/* 这里用Outlet渲染子路由的组件 */}
                <Outlet />
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

关键说明

  • 嵌套路由的父路由必须包含<Outlet />,用来承载子路由的组件内容
  • Sidebar里的Link使用相对路径(to="item1"),会自动拼接父路由的路径(/home),最终跳转路径为/home/item1
  • 若需要设置进入/home时默认显示的组件,添加index路由即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:34:53