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

React Router Dom V6中如何让侧边栏组件避免重复渲染

解决方案

核心思路是用布局组件拆分公共导航和受保护路由的侧边栏,让Sidebar作为受保护路由的父级组件存在,这样切换子路由时不会重复渲染,同时自动替换Navbar的显示逻辑。

1. 创建两个布局组件

分别处理公共页面(带Navbar)和受保护页面(带Sidebar)的布局:

// 公共页面布局:包含Navbar
function PublicLayout({ children }) {
  return (
    <div>
      <Navbar />
      {children}
    </div>
  );
}

// 受保护页面布局:包含Sidebar,子路由内容放在主区域
function ProtectedLayout({ children }) {
  return (
    <div className="flex">
      <Sidebar />
      <main className="flex-1">
        {children}
      </main>
    </div>
  );
}

2. 重构路由结构

将公共路由嵌套在PublicLayout下,受保护路由先通过ProtectedRoute验证,再嵌套在ProtectedLayout下:

<div className="flex flex-col">
  <BrowserRouter>
    <Routes>
      {/* 公共页面组:自动显示Navbar */}
      <Route element={<PublicLayout />}>
        <Route path='/' element={<Home />} />
        <Route path='/sign-in' element={<Signin />} />
        <Route path='/sign-up' element={<Signup />} />
        <Route path='/contact' element={<Contact />} />
        <Route path='/about' element={<About />} />
        <Route path='*' element={<p>There is nothing here: 404!</p>} />
      </Route>

      {/* 受保护页面组:先验证权限,再显示Sidebar */}
      <Route element={<ProtectedRoute />}>
        <Route element={<ProtectedLayout />}>
          <Route path='/dashboard' element={<Dashboard />} />
          <Route path='/chat' element={<Chat />} />
        </Route>
      </Route>
    </Routes>
  </BrowserRouter>
</div>

效果说明

  • 访问公共路由(如/、/sign-in)时,自动渲染Navbar,不显示Sidebar;
  • 访问受保护路由(如/dashboard、/chat)时,先经过ProtectedRoute的权限校验,通过后渲染Sidebar,且切换这两个路由时,Sidebar作为父组件不会重新渲染,只有子页面(Dashboard/Chat)更新;
  • 无需在每个受保护页面手动添加Sidebar,避免重复渲染和代码冗余。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:50:28