react路由5和6新增及区别

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>;

区别:

  • SwitchRoutes 取代,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");

区别:

  • useHistoryuseNavigate 取代,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.paramsuseParams() 取代,直接在组件内获取动态参数。

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 层级嵌套过深。

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" />} />;

区别:

  • RedirectNavigate 取代,必须用 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,但整体结构更简洁,代码可读性更好。

相关推荐
用户90443816324603 分钟前
AI 生成的 ES2024 代码 90% 有坑!3 个底层陷阱 + 避坑工具,项目 / 面试双救命
前端·面试
小p6 分钟前
react学习6:受控组件
前端·react.js
黑云压城After13 分钟前
纯css实现加载动画
服务器·前端·css
鹏多多15 分钟前
Web使用natapp进行内网穿透和预览本地页面
前端·javascript
ttod_qzstudio26 分钟前
Vue 3 Props 定义详解:从基础到进阶
前端·vue.js
钱端工程师27 分钟前
uniapp封装uni.request请求,实现重复接口请求中断上次请求(防抖)
前端·javascript·uni-app
dcloud_jibinbin29 分钟前
【uniapp】解决小程序分包下的json文件编译后生成到主包的问题
前端·性能优化·微信小程序·uni-app·vue·json
茶憶32 分钟前
uniapp移动端实现触摸滑动功能:上下滑动展开收起内容,左右滑动删除列表
前端·javascript·vue.js·uni-app
Ayn慢慢35 分钟前
uni-app PDA焦点录入实现
前端·javascript·uni-app
一位搞嵌入式的 genius1 小时前
微前端架构:JavaScript 隔离方案全解析(含 CSS 隔离)概要
前端·css·前端实战