javascript - React Router v6 中嵌套在路由内部时组件丢失

标签 javascript reactjs react-router react-router-dom

当使用 React Router v6 将 ChoosePlayer 组件嵌套在 Route 中时,

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />

    <Route path="/players">
      <Route element={<ChoosePlayer />} />
      // <--- Some dynamically generated routes here for /players/{playerName}
      // These inner routes shows a modal in addition to ChoosePlayer in the background
    </Route>

  </Routes> 
</BrowserRouter>

当我们位于 URL http://localhost:3000/playershttp://localhost:3000/时,ChoosePlayer 组件不会呈现玩家/到达者

作为健全性检查,当我们有

时,ChoosePlayer 组件将在 http://localhost:3000/chooseplayer 处呈现

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/chooseplayer" element={<ChoosePlayer />} />
  </Routes> 
</BrowserRouter>

以及在 http://localhost:3000/players 处,当 index 添加到其 Route 组件时,但这会阻止 ChoosePlayer 显示在 http://localhost:3000/players/reacher

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />

    <Route path="/players">
      <Route index element={<ChoosePlayer />} />
      // <--- Some dynamically generated routes here for /players/{playerName}
      // These inner routes shows a modal in addition to ChoosePlayer in the background
    </Route>

  </Routes> 
</BrowserRouter>

为什么第一个示例中没有渲染?有没有办法在 React Router v6 中做到这一点?我认为这种方法在 React Router v5 中有效。

谢谢!

最佳答案

所以我收集到您想要渲染这个 ChoosePlayer 组件,路径为 "/players" 并且某些 “/players/*” 路径上时。在这种情况下,您将 ChoosePlayer 更多地视为呈现一组嵌套路由的布局组件。

问题

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/players">
      <Route element={<ChoosePlayer />} />
      // <--- Some dynamically generated routes here for /players/{playerName}
      // These inner routes shows a modal in addition to ChoosePlayer in the background
    </Route>
  </Routes> 
</BrowserRouter>

ChoosePlayer 路由缺少匹配和渲染的路径。

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/chooseplayer" element={<ChoosePlayer />} />
  </Routes> 
</BrowserRouter>

ChoosePlayer 已匹配并呈现,但不在 "/players/*" 路由上,并且没有任何嵌套子路由。

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/players">
      <Route index element={<ChoosePlayer />} />
      // <--- Some dynamically generated routes here for /players/{playerName}
      // These inner routes shows a modal in addition to ChoosePlayer in the background
    </Route>
  </Routes> 
</BrowserRouter>

索引路由,ChoosePlayer 在路径完全 "/players" 时匹配并渲染,但被排除在渲染之外当匹配和渲染其他嵌套路由之一时。

解决方案

我建议将 ChoosePlayer 向上移动到根 "/players" 路由中,并渲染一个 Outlet 组件,以便将嵌套路由渲染到.

示例:

import { Outlet } from 'react-router-dom';

const ChoosePlayer = () => {
  //  ...any component business logic...

  return (
    <div /* any container props/styling/etc... */>
      {/* Common Choose Players UI */}
      <Outlet /> // <-- nested routes render into here
    </div>
  );
};

...

<BrowserRouter>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/players" element={<ChoosePlayer />} >
      // <--- Some dynamically generated routes here for /players/{playerName}
      // These inner routes shows a modal in addition to ChoosePlayer in the background
    </Route>
  </Routes> 
</BrowserRouter>

您可以阅读有关布局路线的更多信息 here .

关于javascript - React Router v6 中嵌套在路由内部时组件丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71365484/

相关文章:

javascript - React router render prop 路由总是重新渲染组件

javascript - Foundation 6 JS 在 Rails 元素中不起作用

javascript - 使用@testing-library/react 对 react-router 的链接进行最简单的测试

javascript - 无法在 Firefox 中设置 element.style.float?

javascript - 删除输入字段所需的验证(如果我在另一个输入字段中输入了一些文本)

javascript - 更改输入元素的只读属性: ReactJS

javascript - 如何在 React 项目的 axios 拦截器中添加全局加载/自旋效果

react-router - 如何在中继容器之间传递变量

javascript - 调用全局函数且无法返回定义的变量

javascript - 路由 asp.net mvc 中的 AJAX 错误