我有以下两份文件

AppRoutes.tsx

import { Route, Routes } from "react-router-dom";
import NotFound from "../pages/NotFound";
import MessageRoutes from "../features/messages/routes/MessageRoutes";
import Home from "../pages/Home";

export default function AppRoutes() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/messages/*" element={<MessageRoutes />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}

MessageRoutes.tsx

import { Route, Routes } from "react-router-dom";
import ProtectedRoutes from "../../../routes/ProtectedRoutes";
import MessageOverview from "../pages/MessageOverview";
import NewMessage from "../pages/NewMessage";

export default function MessageRoutes() {
  return (
    <Routes>
      <Route element={<ProtectedRoutes />}>
        <Route path="/" element={<MessageOverview />} />
        <Route path="/new" element={<NewMessage />} />
      </Route>
    </Routes>
  );
}

因为我使用路径"/Messages/*"来捕获所有以/Messages开头的路径,所以我的MessageRoutes组件负责处理这些嵌套的路由.我在AppRoutes组件中有一个最后的"*"路径来捕获应用程序不支持的任何url.但是,如果路径是"/Messages/lorefipsum",Reaction路由不会捕获NotFound路由,因为所有以"/Messages"开头的内容都将由MessageRoutes组件处理.

这是否意味着在每个嵌套的路由组件中,我现在必须再次添加最后一个<Route path="\*" element={\<NotFound /\>} /\>,才能支持最终的全部捕获路由?我不喜欢这种方式.难道每条路由都没有绝对的终极目标吗?

推荐答案

这是否意味着我现在必须在每个嵌套的管线组件中添加 又一次打进了<Route path="\*" element={<NotFound />} \>

是的,绝对的.每个Routes组件管理其自己的路由"范围",以寻找它可以匹配的路由.例如,如果当前URL路径为"/messages/loremipsum",则根Routes组件与"/messages/*"匹配,并正确呈现MessageRoutes组件.然后,MessageRoutes组件的Routes组件在下一路径段上进行匹配.由于没有"*/loremipsum"路由路径,因此您需要另一个"包罗万象"的路由来处理此问题.

问题是,Routes组件不知道它的任何路由may可能呈现的101路由是什么.

示例:

import { Route, Routes } from "react-router-dom";
import NotFound from "../pages/NotFound";
import MessageRoutes from "../features/messages/routes/MessageRoutes";
import Home from "../pages/Home";

export default function AppRoutes() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/messages/*" element={<MessageRoutes />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}
import { Route, Routes } from "react-router-dom";
import ProtectedRoutes from "../../../routes/ProtectedRoutes";
import MessageOverview from "../pages/MessageOverview";
import NewMessage from "../pages/NewMessage";
import NotFound from "../pages/NotFound";

export default function MessageRoutes() {
  return (
    <Routes>
      <Route element={<ProtectedRoutes />}>
        <Route path="/" element={<MessageOverview />} />
        <Route path="/new" element={<NewMessage />} />
        <Route path="*" element={<NotFound />} />
      </Route>
    </Routes>
  );
}

如果你想要有一个"包罗万象"的路由,那么你就需要有一个单一的路由配置.

示例:

import { Route, Routes } from "react-router-dom";
import MessageOverview from "../pages/MessageOverview";
import NewMessage from "../pages/NewMessage";
import NotFound from "../pages/NotFound";
import Home from "../pages/Home";

export default function AppRoutes() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route element={<ProtectedRoutes />}>
        <Route path="/messages">
          <Route index element={<MessageOverview />} />
          <Route path="new" element={<NewMessage />} />
        </Route>
      </Route>
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}

现在,当/如果URL路径是"/messages/loremipsum"时,则this Routes组件知道它正在呈现什么103路由,并且可以匹配并且可以正确地呈现NotFound.

Javascript相关问答推荐

是什么原因导致此Angular 16电影应用程序中因类型错误而不存在属性?

Phaser 3 console. log()特定游戏角色的瓷砖属性

将自定义排序应用于角形数字数组

在这种情况下,如何 for each 元素添加id?

无法读取未定义错误的属性路径名''

邮箱密码重置链接不适用于已部署的React应用程序

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

是否可以将异步调用与useState(UnctionName)一起使用

ngOnChanges仅在第二次调用时才触发

如何在独立的Angular 应用程序中添加Lucide-Angel?

表单数据中未定义的数组键

我如何才能获得价值观察家&对象&S的价值?

React数组查找不读取变量

验证Java脚本函数中的两个变量

如何按区域进行过滤并将其从结果数组中删除?

从客户端更新MongoDB数据库

对象作为react 子对象无效(已找到:具有键的对象{type,props}).如果要呈现一个子级集合,请改用数组

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?

在openstreemap/leaflet中,当鼠标在 map 上移动时,如何在小工具提示中实时显示坐标