如何在 react-router v6 中的树结构中创建深层路径

达达1

这是一个说明问题的代码框:

如果我有这样的对象树:

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>
  );
}

请注意尾随通配符"*"匹配器以允许匹配嵌套路由。还要注意后退链接现在是"../.."因为每一级嵌套都会推送两个路径段,所以要“返回”两个路径段需要删除。

编辑 how-to-create-deep-paths-in-a-tree-structure-in-react-router-v6

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在React Router v6中,如何在离开页面/路由之前检查表单是否脏

查看不会更新,但URL在React Router V6中会显示

如何使用React Router v6将参数传递给链接?

如何在react-router-dom v6中返回上一条路由

如何在课堂上从 react-router-dom v6 获取参数值

react-router v6如何在react组件外使用navigator,比如axios拦截器

如何观察 React Router v6 中的查询字符串是否发生变化?

在 react-router-dom v6 中的 history.replace

在 react router v6 中使用導航功能時如何傳遞數據

如何在 React Router v6 中重定向?

如何導航到 React Router Dom V6 中的嵌套路由

React Router v6 onclick

react-router-dom V6 中的嵌套路由

在 React js react-router-dom V6 中實現嵌套路由

React Router v6 中的頁面佈局損壞

React Router Dom v6 中的重定向

在 React Router v6 中嵌套路由時將道具傳遞給 <Outlet />?

如何在 React Router v6 中的嵌套父路由上設置索引路由

React-Router v6 未在生產中呈現

React Router V6 activeStyle 问题

如何在 react-router-dom v6 的活动 NavLink 中显示不同的图标?

如何不在登陆(登录页面)页面上呈现标题,但始终在 react-router v6 中的所有其他页面上呈现?

React Router v6 - 如何在路由中使用@符号?

如何启用 ListItemButton 以使用 React Router v6 Link?

嵌套路由在 React Router v6 中不起作用

React Router Dom V6 中的 <Link> 标记未按预期工作

我如何将其升级到 react-router-dom v6

React router v6:如何获取组件中的相对索引路径?

React-Router-Dom v6 中的重定向