javascript - 如何导航到 React Router Dom V6 中的嵌套路由
问题描述
我正在尝试从导航元素中打开嵌套路由。应用程序本身在 /app 下运行(因此我将任何不存在的 URL 重定向到 /app)。在 /app Route 内呈现的布局组件中,我正在创建主导航以及最终应该是内容的 Routes。但是,一旦我单击“搜索”或“查看”,URL 就会更改为正确的路径,但会立即将我重定向到 /app,就好像“搜索”和“查看”路由本身不存在一样。
最小的例子:
https://codesandbox.io/s/fragrant-field-ygwbf
应用程序.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>
);
};
感谢您的任何建议
解决方案
问题
看一下浏览器控制台,它会显示:
您在“/app”(在 下)呈现后代(或称为
useRoutes()
),但父路由路径没有尾随“*”。这意味着如果您导航得更深,父路由将不再匹配,因此子路由将永远不会呈现。
因此,嵌套路由(根据文档进行更深入的导航)将永远不会呈现,并且您看不到Search
andView
子路由。
更新(感谢德鲁里斯):
在 v6 中,所有路由路径始终完全匹配,不再像 v4/5 中那样匹配路径前缀。父/根路径需要指定 * 通配符,以便它们现在可以“前缀”匹配。
解决方案
请将父级更改
<Route path="/app">
为<Route path="/app/*">
.
所以在App.tsx
:
<BrowserRouter>
<Routes>
<Route path="/app/*" element={<Layout />} />
<Route path="*" element={<Navigate to="/app" />} />
</Routes>
</BrowserRouter>
在代码框上编辑
推荐阅读
- spring-boot - 如何在spring-boot中根据路径变量应用不同的验证规则
- r - R:使用j中的匹配在两个data.tables之间移动数据
- javascript - componentWillReceiveProps/getDerivedStateFromProps 的用途
- python - 使用pyzbar读取python中的模糊条码
- java - 创建一个改变耳机音量的方法,java类
- php - 解决“致命错误:在 null 上调用成员函数 children()”
- php - Codeigniter - 计算桌子上的所有东西不起作用
- javascript - JavaScript 获取数组中所有 aria-labels 中的值(文本)并将值添加到列表中
- vb.net - 从富文本框中的最后一行获取文本
- excel - 在唯一 ID 中使用通配符的 VLOOKUP