我有一个这样的路由器
import { createRoot } from 'react-dom/client';
// react-router v7
import { createHashRouter, Link, Outlet, RouterProvider } from 'react-router';
const root = document.createElement('div');
root.setAttribute('id', 'app');
document.body.appendChild(root);
const router = createHashRouter([
{
path: 'homepage',
element: (
<div>
<Link to="workspace/1">To workspace 1</Link>
<br />
<Link to="foo">To foo</Link>
<main>
<Outlet />
</main>
</div>
),
children: [
{
path: 'workspace/:spaceId/*',
// I want to lazy load this route, so I use <Routes> to define its sub routes
element: (
<div>
<Link to="setting">To space setting</Link>
<Routes>
<Route path="setting" />
</Routes>
</div>
),
},
{
path: 'foo',
element: <div>foo</div>,
},
],
},
]);
createRoot(root).render(
<RouterProvider router={router} />,
);
主页中的工作<Link>
正常。但是当我多次点击“到空间设置”链接时,路径变为/homepage/workspace/1/setting/setting/setting...
。
我不想在链接中写绝对路径,例如。<Link to="/homepage/workspace/${spaceId}/setting" />
有没有更好的方法来解决这个问题?
我尝试过:
- 定义子路由以
createHashRouter
删除 splat,<Link>
效果很好。但这不是我想要的。 - 获取路线的当前路径以便我可以使用
<Link to={`${currentPath}/setting`} />
,但我没有找到用于这样做的 APIreact-router
。
需要花点时间研究一下 React-Router v7 CHANGELOG 和文档,但从 RR6 到 RR7 相对路径(
v7_relativeSplatPath
功能标志)的迁移路径相对简单。https://reactrouter.com/upgrading/v6#v7_relativesplatpath
老的:
当前的:
老的:
当前的:
最后的关键是让后代路由元素也精确地呈现在 上
"/homepage/workspace/:spaceId"
。为此,使该"workspace/:spaceId"
路由也成为索引路由。最终代码: