这是一个说明问题的代码框:
如果我有这样的对象树:
const tasks: Task[] = [
{
id: 1,
name: "one",
children: [
{
id: 3,
name: "three",
children: [{ id: 5, name: "five", children: [] }]
}
]
},
{
id: 2,
name: "two",
children: [
{ id: 4, name: "four", children: [{ id: 6, name: "six", children: [] }] }
]
}
];
我希望能够链接到这样的网址:
/tasks/2/children/4/children/6
.
到目前为止,我只能通过tasks/2/children/6
以下路由结构链接到它:
let routes: RouteObject[] = [
{
path: "tasks",
element: <Layout />,
children: [
{
path: ":id",
element: <TaskPage />,
children: [
{ path: "children/:id", element: <TaskPage />, index: true }
]
},
{
index: true,
element: <TaskTreePage />
}
]
},
{
index: true,
element: <Navigate to="tasks" />
}
];
let element = useRoutes(routes);
每次我深入一个新级别时,我都需要不断添加嵌套路由。
有没有一种方法可以动态构建适用于任何深度的深度嵌套路由路径?
当路由是索引路由时,它不应该也使用path
道具,因为它理解路径是包装父布局路由的路径。
TaskPage
组件应该是动态的,而不是路由配置。路由配置应该是渲染“根”TaskPage
组件的“根”路由的入口点"/tasks/:id/*"
。该TaskPage
组件现在有效地递归地在<Route path="children/:id/*" element={<TaskPage />} />
它呈现的新嵌套相对路径中呈现其自身的另一个实例。
代码示例:
应用程序
const routes: RouteObject[] = [
{
path: "/tasks",
element: <Layout />,
children: [
{
path: ":id/*",
element: <TaskPage />
},
{
index: true,
element: <TaskTreePage />
}
]
},
{
index: true,
element: <Navigate to="/tasks" />
}
];
export default function App() {
const element = useRoutes(routes);
return element;
}
任务页
这就是“魔术”发生的地方。它渲染一个Routes
具有两条路由的新组件,一个用于渲染当前深度的链接的索引路由和一个用于渲染嵌套子级的路由。
function TaskPage() {
const { id } = useParams();
const task = findTask(id as string, tasks);
if (!task) {
return <h2>Not Found!</h2>;
}
return (
<Routes>
<Route
index
element={
<div>
<h2>task of {task.name}</h2>
<div>
<Link to="../..">Back</Link>
<div>
<h2>Children</h2>
{task.children.map((child: Task) => (
<Link key={child.id} to={`children/${child.id}`}>
{child.name}
</Link>
))}
</div>
</div>
</div>
}
/>
<Route path="children/:id/*" element={<TaskPage />} />
</Routes>
);
}
请注意尾随通配符"*"
匹配器以允许匹配嵌套路由。还要注意后退链接现在是"../.."
因为每一级嵌套都会推送两个路径段,所以要“返回”两个路径段需要删除。
const tasks: Task[] = [
{
id: 1,
name: "one",
children: [
{
id: 3,
name: "three",
children: [
{
id: 5,
name: "five",
children: [{ id: 7, name: "seven", children: [] }]
}
]
}
]
},
{
id: 2,
name: "two",
children: [
{ id: 4, name: "four", children: [{ id: 6, name: "six", children: [] }] }
]
}
];
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句