Routes
组件只能直接包含 <Route>
或 <React.Fragment>
作为有效的子组件。像这样,Categories
和 Details
都不能被 Routes
直接渲染。
可以将所有路由合并在一起进行渲染:
const App = () => {
return (
<div className="app__container">
<BrowserRouter>
<Header />
<Nav />
<Routes>
<Route path="/" element={<Navigate replace to="/movie" />} />
<Route path="/search" element={<Search />} />
<Route path="/movie">
<Route index element={<Movies />} />
<Route path=":tmdbID" element={<MovieDetail />} />
</Route>
<Route path="/tv">
<Route index element={<Tv />} />
<Route path=":tmdbID" element={<TvDetail />} />
</Route>
<Route path="/person">
<Route index element={<People />} />
<Route path=":tmdbID" element={<PersonDetail/>} />
</Route>
</Routes>
</BrowserRouter>
</div>
);
};
这种组织方式使用了嵌套(或称为层级)路由。
如果你想通过代码分割来优化,可以根据逻辑将路由分为父级路由和子路由,其中组件负责渲染下级路由。为了让子路由正常工作,父级路由在其路径后添加一个通配符匹配符(即 splat,"*"
),然后由路由指向的组件渲染另一个 <Routes>
和一系列 <Route>
组件。
以下是 Movie、Tv 和 Person 的子路由组件示例:
const MovieRoutes = () => (
<Routes>
<Route path="/" element={<Movies />} />
<Route path=":tmdbID" element={<MovieDetail />} />
</Routes>
);
const TvRoutes = () => (
<Routes>
<Route path="/" element={<Tv />} />
<Route path=":tmdbID" element={<TvDetail />} />
</Routes>
);
const PersonRoutes = () => (
<Routes>
<Route path="/" element={<People />} />
<Route path=":tmdbID" element={<PersonDetail />} />
</Routes>
);
最后在 App
组件中引用这些子路由组件,并添加通配符到父级路由路径中:
const App = () => {
return (
<div className="app__container">
<BrowserRouter>
<Header />
<Nav />
<Routes>
<Route path="/" element={<Navigate replace to="/movie" />} />
<Route path="/search" element={<Search />} />
<Route path="/movie/*" element={<MovieRoutes />} />
<Route path="/tv/*" element={<TvRoutes />} />
<Route path="/person/*" element={<PersonRoutes />} />
</Routes>
</BrowserRouter>
</div>
);
};