这个Reaction-RoutV5递归路由示例正好显示了我想要实现的目标:https://v5.reactrouter.com/web/example/recursive-paths

然而,我使用的是react-router-dom@6,在将我的代码转换为V6之后,输出并不是我所期望的.

import {
  Routes,
  Route,
  Link,
  useParams,
  Outlet,
} from "react-router-dom";

export default function RecursiveExample() {
  return (
    <>
      <Routes>
        <Route path="/:id" element={<Person />} />
      </Routes>
    </>
  );
}

function Person() {
  let { id } = useParams();
  let person = find(parseInt(id as string, 10));

  return (
    <div>
      <h3>{person!.name}’s Friends</h3>

      <ul>
        {person!.friends.map(id => (
          <li key={id}>
            <Link to={`${id}`}>{find(id)?.name}</Link>
          </li>
        ))}
      </ul>

      {/* Outlet will render any nested routes */}
      <Outlet />
    </div>
  );
}

const PEEPS = [
  { id: 0, name: "Michelle", friends: [1, 2, 3] },
  { id: 1, name: "Sean", friends: [0, 3] },
  { id: 2, name: "Kim", friends: [0, 1, 3] },
  { id: 3, name: "David", friends: [1, 2] }
];

function find(id:any) {
  return PEEPS.find(p => p.id === id);
}

当点击链接到下一个人id时,我收到控制台错误"No routes matched location "/0/1" "

我如何递归地呈现这些路由,同时仍然保持与V5示例中相同的URL struct ,例如"host.com/1/3/2/..."

推荐答案

问题是,您假设根路由正在呈现104个路由(i.e. a 100 rendering another 100 directly),而实际上您正在呈现105个路由(a routed component rendering another 102 and 100 components).通过只渲染一条路由和一个出口,您不能深入超过一个级别,例如,您只能渲染根级别的路由,任何比这更深的路径都没有任何匹配的路由,例如,您看到的不变错误.

Routes组件取代了RRDv5 Switch组件,因此在RRDv5递归路径演示中,每个Person组件都呈现下一条路径,RRDv6模拟用于Person呈现另一个Routes和递归Route组件.RRD v5和v6之间的另一个主要区别是,为了使后代路由是可匹配和可呈现的,它们的父路由必须将通配符"*"或分隔符附加到其路径的末尾.

示例:

export default function RecursiveExample() {
  return (
    <Routes>
      <Route index element={<Navigate to="/0" replace />} />
      <Route path="/:id/*" element={<Person />} />
    </Routes>
  );
}
function find(id?: string | number) {
  return PEEPS.find(p => String(p.id) === String(id));
}

function Person() {
  const { id } = useParams();
  const person = find(id);

  return (
    <div>
      <h3>{person!.name}’s Friends</h3>

      <ul>
        {person!.friends.map(id => (
          <li key={id}>
            <Link to={`${id}`}>{find(id)?.name}</Link>
          </li>
        ))}
      </ul>

      <Routes>
        <Route path="/:id/*" element={<Person />} />
      </Routes>
    </div>
  );
}

Edit recursive-friend-routes-in-react-router-v6

Typescript相关问答推荐

交叉点对数字和布尔的处理方式不同

为什么在TypScript中写入typeof someArray[number]有效?

如何在函数参数中使用(或模仿)`success`的行为?

typescribe不能使用值来索引对象类型,该对象类型满足具有该值的另一个类型'

Angular中的其他服务仅获取默认值

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

我可以为情态车使用棱角形的路由守卫吗?

被推断为原始类型的交集的扩充类型的交集

从TypeScrip中的其他类型检索泛型类型

如何实现异构数组内函数的类型缩小

从泛型类型引用推断的文本类型

创建Angular 为17的动态形状时出错

如何将类似数组的对象(字符串::匹配结果)转换为类型脚本中的数组?

如何将spread operator与typescripts实用程序类型`参数`一起使用

TypeScrip-如何自动推断UNION变量的类型

有没有办法传递泛型类型数组,以便推断每个元素的泛型类型?

使用&reaction测试库&如何使用提供程序包装我的所有测试组件

类型分布在第一个泛型上,但不分布在第二个泛型上

TS 条件类型无法识别条件参数

const 使用条件类型时,通用类型参数不会推断为 const