React Router 6 相比 React Router 5 进行了一些重要的升级和改动,主要包括 API 的简化、性能优化和新的特性。以下是主要的区别和新增功能:
1. 路由声明方式变化
React Router 5:
javascript
import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
<Router>
<Switch>
<Route path="/home" component={Home} />
<Route path="/about" component={About} />
</Switch>
</Router>;
React Router 6:
javascript
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
<Router>
<Routes>
<Route path="/home" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Router>;
区别:
Switch被Routes取代,Route需要用element传递组件,而不是component。
2. 默认启用嵌套路由
React Router 5:
xml
<Router>
<Route path="/dashboard" component={Dashboard} />
<Route path="/dashboard/profile" component={Profile} />
</Router>;
React Router 6(嵌套路由):
xml
<Routes>
<Route path="/dashboard" element={<Dashboard />}>
<Route path="profile" element={<Profile />} />
</Route>
</Routes>;
区别:
- 6 版本支持嵌套路由 ,不需要手动拼接路径(
/dashboard/profile),而是直接写profile,这样Profile组件会在Dashboard组件中渲染Outlet。
3. useNavigate 取代 useHistory
React Router 5:
ini
import { useHistory } from "react-router-dom";
const history = useHistory();
history.push("/home");
React Router 6:
ini
import { useNavigate } from "react-router-dom";
const navigate = useNavigate();
navigate("/home");
区别:
useHistory被useNavigate取代,push变成了navigate。
4. 动态参数 match 变化
React Router 5:
ini
<Route path="/user/:id" component={User} />
const { id } = match.params;
React Router 6:
ini
<Route path="/user/:id" element={<User />} />
const { id } = useParams();
区别:
match.params被useParams()取代,直接在组件内获取动态参数。
5. useRoutes 方式配置路由
React Router 6 新增 useRoutes(),允许用数组方式定义路由:
javascript
import { useRoutes } from "react-router-dom";
const routes = [
{ path: "/home", element: <Home /> },
{ path: "/about", element: <About /> },
];
const App = () => {
return useRoutes(routes);
};
优点:
- 让路由更符合组件化思想,避免 JSX 层级嵌套过深。
6. redirect 变更为 Navigate
React Router 5:
ini
import { Redirect } from "react-router-dom";
<Route path="/" exact>
<Redirect to="/home" />
</Route>;
React Router 6:
javascript
import { Navigate } from "react-router-dom";
<Route path="/" element={<Navigate to="/home" />} />;
区别:
Redirect被Navigate取代,必须用element传递。
7. exact 默认行为
React Router 6 默认匹配完整路径,不需要 exact:
React Router 5:
ini
<Route path="/home" exact component={Home} />
React Router 6:
ini
<Route path="/home" element={<Home />} />
总结:
| 特性 | React Router 5 | React Router 6 |
|---|---|---|
| 路由声明 | <Switch> |
<Routes> |
| 组件传递 | component={} |
element={<Component />} |
| 嵌套路由 | 需要完整路径 | 直接嵌套 <Route> |
| 页面跳转 | useHistory().push() |
useNavigate() |
| 获取参数 | match.params |
useParams() |
| 重定向 | <Redirect> |
<Navigate> |
exact 关键词 |
需要 exact |
默认精确匹配 |
| 路由数组 | 不支持 | useRoutes() |
如果你的项目是 React Router 5,升级到 6 可能需要修改这些 API,但整体结构更简洁,代码可读性更好。