【问题标题】:How can I navigate to a nested Route in React Router Dom V6如何导航到 React Router Dom V6 中的嵌套路由
【发布时间】:2021-12-24 16:31:07
【问题描述】:

我正在尝试从导航元素中打开嵌套路由。 应用程序本身在 /app 下运行(因此我将任何不存在的 URL 重定向到 /app)。 在 /app Route 内呈现的布局组件中,我正在创建主导航以及最终应该是内容的 Routes。但是,一旦我单击“搜索”或“查看”,URL 就会更改为正确的路径,但会立即将我重定向到 /app,就好像“搜索”和“查看”路由本身不存在一样。

小例子:

https://codesandbox.io/s/fragrant-field-ygwbf

App.tsx

 <BrowserRouter>
    <Routes>
       <Route path="/app" element={<Layout />} />
       <Route path="*" element={<Navigate to="/app" />} />
    </Routes>
 </BrowserRouter>

布局.tsx

const Layout = () => {
  const navigate = useNavigate();
  const handleSearchClick = (e: any) => {
    e.preventDefault();
    // do some tasks
    navigate("inventory/search");
  };

  const handleViewClick = (e: any) => {
    e.preventDefault();
    // do some tasks
    navigate("inventory/view");
  };

  return (
    <div>
      <nav>
        <button onClick={handleSearchClick}>Search</button>
        <button onClick={handleViewClick}>View</button>
      </nav>
      <Routes>
        <Route path="/users">
          <Route path="about" element={<p>example</p>} />
        </Route>
        <Route path="/inventory">
          <Route path="search" element={<Search />} />
          <Route path="view" element={<View />} />
        </Route>
      </Routes>
      The content of search / view should now be displayed below the
      Buttons
    </div>
  );
};

感谢您的建议

【问题讨论】:

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


    【解决方案1】:

    问题

    看看浏览器控制台,它会告诉你:

    您在“/app”(在 下)呈现后代(或称为useRoutes()),但父路由路径没有尾随“*”。这意味着如果您导航更深,父路由将不再匹配,因此子路由将永远不会呈现。

    因此,嵌套路由(根据文档进行更深入的导航)将永远不会呈现,并且您看不到 SearchView 子路由。

    更新感谢 Drew Reese):

    在 v6 中,所有路由路径总是完全匹配,不再像 v4/5 中那样匹配路径前缀。父/根路径需要指定 * 通配符,以便它们现在可以“前缀”匹配。

    解决方案

    请将父级&lt;Route path="/app"&gt; 更改为&lt;Route path="/app/*"&gt;

    所以在App.tsx:

    <BrowserRouter>
        <Routes>
           <Route path="/app/*" element={<Layout />} />
           <Route path="*" element={<Navigate to="/app" />} />
        </Routes>
     </BrowserRouter>
    

    编辑codesandbox

    【讨论】:

    • 非常感谢:D,我一直在寻找文字时间,但无法弄清楚
    • 这是我的荣幸,祝你好运@Lavariet
    • 这是因为在 v6 中,所有路由路径都总是 完全匹配,不再像 v4/5 中那样匹配路径前缀。父/根路径需要指定* 通配符,以便它们现在可以“前缀”匹配。
    • 感谢您提供有用的详细信息,我已根据您的评论更新了我的答案。你是完美的@DrewReese
    猜你喜欢
    • 1970-01-01
    • 2022-11-06
    • 1970-01-01
    • 2022-08-14
    • 2022-06-28
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2021-11-03
    相关资源
    最近更新 更多