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

router-dom v6.15.0中如何配置带Link的全局Sidebar等组件?

解决方案

问题出在你把Sidebar和SearchField放在了RouterProvider外部,导致组件内的Link无法获取路由上下文,自然会报错。同时直接修改根路由元素的方式没有利用嵌套路由,所以其他页面不会继承这两个组件的显示。

正确的做法是使用嵌套路由+全局布局,让所有页面共享同一个包含Sidebar和SearchField的布局:

1. 修改路由配置

首先在路由配置里创建一个根布局路由,用Outlet渲染子路由的内容,把所有页面路由作为它的子路由:

import { createBrowserRouter, Outlet, redirect } from 'react-router-dom';

const router = createBrowserRouter([
  {
    path: "/",
    // 全局布局:所有页面都会显示这两个组件
    element: (
      <div id="page">
        <Sidebar />
        <SearchField />
        <Outlet /> {/* 子路由的内容会渲染在这 */}
      </div>
    ),
    children: [
      // 根路径重定向(用index路由匹配父路径的默认情况)
      {
        index: true,
        loader: () => redirect("city/New%20York"),
        element: <></>,
      },
      {
        path: "city/:cityName",
        element: <WeatherContent />,
      },
      {
        path: "cities",
        element: <WeatherContent />,
      },
      {
        path: "settings",
        element: <WeatherContent />,
      },
      {
        path: "*",
        element: (
          <div>
            <h1>Error 404</h1>
            <h2>page not found</h2>
            <Link to="/">Go back home</Link> {/* 修正跳转路径,原"home"不存在 */}
          </div>
        ),
      },
    ],
  },
]);

2. 简化App组件

现在App组件只需要渲染RouterProvider即可,不用再单独放置Sidebar和SearchField:

function App() {
  return <RouterProvider router={router} />;
}

为什么这样能解决问题

  • Sidebar和SearchField现在处于RouterProvider提供的路由上下文内部,组件内的Link可以正常获取路由信息,不会报错。
  • 通过Outlet实现嵌套路由,所有子路由都会自动继承根布局的内容,确保这两个组件在所有页面显示。
  • 保留了根路径的重定向逻辑,访问/时依然会跳转到纽约的天气页面。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:53:23