P粉4589136552023-08-26 17:20:32
是的,絕對可以。每個Routes
元件都管理著自己可以匹配的路由的「範圍」。例如,如果目前的URL路徑是"/messages/loremipsum"
,根Routes
元件會符合"/messages/*"
,並正確渲染MessageRoutes
元件。然後,MessageRoutes
元件的Routes
元件會繼續符合下一個路徑段。由於沒有"*/loremipsum"
的路由路徑,您需要另一個「catch-all」路由來處理這個。
問題在於Routes
元件不知道它的任何路由可能渲染的後代路由。
範例:
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> ); }
如果您想要一個單獨的「catch-all」路由,那麼您需要一個單獨的路由配置。
範例:
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"
時,這個Routes
元件知道它正在渲染的#嵌套路由,並且可以正確匹配並渲染NotFound
。