React Router 提供了两个接口来配置路由
- <Routes>:通过在jsx中组件方式
- useRouters通过对象配置方式
例:在index.js里通过<Routes>配置
import React from 'react';
import ReactDOM from 'react-dom';
import { store } from './app/store';
import { Provider } from 'react-redux';
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import App from './App';
import { PostsList } from './features/posts/PostsList';
import { SinglePostPage } from './features/posts/SinglePostPage';
import * as serviceWorker from './serviceWorker';
import './index.css';
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<Routes>
<Route path='/' element={<App />} />
{/* 嵌套路由 */}
<Route path="/postList" element={<PostsList />}>
<Route index element={<div>我是index默认子路由</div>} />
<Route path=":id" element={<div>我是子路由元素</div>} />
</Route>
<Route path="/singlePostPage/:postId" element={<SinglePostPage />} />
<Route path="*" element={<App />} />
</Routes>
</BrowserRouter>
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
serviceWorker.unregister();
例:在index.js里通过useRouters配置,此处配置可提出至单独文件
import React from 'react';
import ReactDOM from 'react-dom';
import { store } from './app/store';
import { Provider } from 'react-redux';
import { BrowserRouter, useRoutes } from 'react-router-dom';
import App from './App';
import { PostsList } from './features/posts/PostsList';
import { SinglePostPage } from './features/posts/SinglePostPage';
import * as serviceWorker from './serviceWorker';
import './index.css';
const GetRoutes = () => {
const routes = useRoutes([
{ path: '/', element: <App /> },
{
path: '/postList',
element: <PostsList />,
children: [
{ path: '/postList/:id', element: <div>我是子路由元素</div> },
{ path: '*', element: <div>404</div>}
],
},
{ path: '/singlePostPage/:postId', element: <SinglePostPage /> },
{ path: '*', element: <div>404</div>}
])
return routes;
}
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<BrowserRouter>
<GetRoutes />
</BrowserRouter>
</Provider>
</React.StrictMode>,
document.getElementById('root')
);
serviceWorker.unregister();
注意嵌套路由需要在父路由使用Outlet呈现其子路由元素
import React from 'react';
import { useSelector } from 'react-redux';
import { Link, Outlet } from 'react-router-dom'
export const PostsList = () => {
const posts = useSelector(state => state.posts);
const renderedPosts = posts.map(post => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content.substring(0,100)}</p>
<Link to={`/singlePostPage/${post.id}`}> 查看详情</Link>
</div>
))
return (
<section>
<h2>posts</h2>
{renderedPosts}
{/* 子路由渲染位置 */}
<Outlet />
</section>
)
}