React Router 5 vs 6:使用上的主要差异与升级指南

React Router 5 的一些API 在 React Router 6 上有时可能找不到,可能会看到如下画面:export ‘useHistory’ was not found in ‘react-router-dom’ …
在这里插入图片描述
React Router目前有两个大的版本,即React Router 5、6。React Router 6 在设计上更加简单易用,引入了更直观的 API,同时也弃用了一些不太常用的功能。对于已有的 React Router 5 项目,升级到 React Router 6 会带来一些改动。

通过分析、对比 React Router 5 和 6 之间的使用差异,可以帮助开发者快速掌React Router 5 和 6 的不同地方、差异。对于有 React Router 5 项目经验的开发者来说,理解这些差异有助于更好地过渡到 React Router 6。更好地管理现有项目的升级,提高开发效率和代码质量,并跟上社区的发展趋势。

在这里插入图片描述

接下来通过示例代码详细比较一下 React Router 5 和 6 在使用上的主要区别:

  1. 路由匹配:
    • React Router 5 使用 path-to-regexp 作为路径匹配引擎,支持动态路由和正则表达式。
    • React Router 6 引入了一种更简单、更直观的匹配机制,默认使用 Matching Patterns。这种模式更易于理解和使用,不再需要处理复杂的正则表达式。

例子:

// React Router 5
<Route path="/users/:id" component={UserDetails} />// React Router 6
<Route path="/users/:userId" element={<UserDetails />} />
  1. 嵌套路由:
    • React Router 5 使用 <Switch> 组件来处理路由匹配,只渲染第一个匹配的组件。
    • React Router 6 摒弃了 <Switch>,改用 <Routes> 组件。<Routes> 会渲染所有匹配的组件,更加灵活。

例子:

// React Router 5
<Switch><Route path="/users/:id" component={UserDetails} /><Route path="/users" component={UserList} />
</Switch>// React Router 6
<Routes><Route path="/users/:userId" element={<UserDetails />} /><Route path="/users" element={<UserList />} />
</Routes>
  1. 编程式导航:
    • React Router 5 使用 withRouter 高阶组件或 this.props.history 来实现编程式导航。
    • React Router 6 弃用了 withRouter,改用 useNavigate hook 来实现编程式导航。

例子:

// React Router 5
import { withRouter } from 'react-router-dom';const MyComponent = withRouter(({ history }) => {const handleClick = () => {history.push('/users/123');};return <button onClick={handleClick}>Go to User Details</button>;
});// React Router 6
import { useNavigate } from 'react-router-dom';const MyComponent = () => {const navigate = useNavigate();const handleClick = () => {navigate('/users/123');};return <button onClick={handleClick}>Go to User Details</button>;
};
  1. 参数获取:
    • React Router 5 使用 match.params 获取路由参数。
    • React Router 6 使用 useParams hook 获取路由参数。

例子:

// React Router 5
const UserDetails = ({ match }) => {const { id } = match.params;// ...
};// React Router 6
const UserDetails = () => {const { userId } = useParams();// ...
};
  1. Link 和 NavLink
    • React Router 5 中,<Link> 组件用于构建链接,<NavLink> 组件用于构建导航链接,可以设置 activeClassNameactiveStyle 属性。
    • React Router 6 中,<Link> 组件既可以用于构建链接,也可以用于构建导航链接。可以设置 classNamestyle 属性来指定激活状态下的样式。
// React Router 5
<NavLink to="/home" activeClassName="active">Home
</NavLink>// React Router 6
<Link to="/home" className={({ isActive }) => (isActive ? 'active' : '')}>Home
</Link>
  1. Redirect 组件
    • React Router 5 中使用 <Redirect> 组件进行重定向。
    • React Router 6 中使用 <Navigate> 组件进行重定向。
// React Router 5
<Redirect from="/old-path" to="/new-path" />// React Router 6
<Navigate from="/old-path" to="/new-path" />
  1. 路由配置
    • React Router 5 中使用 <Route> 组件配置路由,可以嵌套 <Switch> 组件。
    • React Router 6 中使用 <Routes> 组件配置路由,不再需要 <Switch> 组件。
// React Router 5
<Route path="/users"><Switch><Route path="/users/:id" component={UserDetails} /><Route path="/users" component={UserList} /></Switch>
</Route>// React Router 6
<Routes><Route path="/users/:userId" element={<UserDetails />} /><Route path="/users" element={<UserList />} />
</Routes>
  1. 历史记录管理
    • React Router 5 中使用 history 对象管理历史记录。
    • React Router 6 中使用 useNavigate hook 管理历史记录。
// React Router 5
const handleClick = () => {props.history.push('/users/123');
};// React Router 6
const navigate = useNavigate();
const handleClick = () => {navigate('/users/123');
};

总的来说,React Router 6 在设计上更加简单易用,引入了更加直观的路由匹配机制和组件结构。同时也弃用了一些不太常用的 API,如 withRouter,转而使用更加灵活的 hook 来实现功能。对于已有的 React Router 5 项目,升级到 React Router 6 可能需要一些改动,但收益是值得的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Anki】25考研408真题【2009-2023】

介绍 24年的真题解析还没有出&#xff01;只到23年&#xff01;一共有15套真题。 预览 客观题和主观题有两个目录。王道建议第一轮只写选择题&#xff0c;第二轮再开始写大题。 客观题&#xff1a; 主观题&#xff1a; 插件建议 See Previous Card Ratings in Reviewer 代码&am…

PM要会项目管理?完整版项目管理经验分享

近9个月&#xff0c;公司发生许多事情&#xff0c;包括产品研发部的人员结构调整。 原本以产品经理负责制的小组研发&#xff0c;变成了以项目经理负责制的项目组研发。 对于这一调整&#xff0c;我是支持的&#xff0c;毕竟产品在跟进项目时对技术的管控能力确实不如懂技术的…

彻底解决:IDEA java: 警告: 源发行版 17 需要目标发行版 17

一、出现的原因 JDK版本不匹配 二、解决方法 1.点击File -->Project Structure-->Project 修改这两处 2.在Project Structure-->Modules中的红框位置都要调整对应版本 3.点击File-->settings-->java compile将对应框的版本修改成对应版本即可 4.修改Pom文件中…

2010年认证杯SPSSPRO杯数学建模C题(第一阶段)高校图书馆的智能服务全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 C题 高校图书馆的智能服务 原题再现&#xff1a; 图书馆源于保存记事的习惯。图书馆是为读者在馆内使用文献而提供的专门场所。而高校的图书馆为教学和科研服务&#xff0c;具有服务性和学术性强的特点。   现在的高校图书馆存在着许多不良的…

吴恩达llama课程笔记:第四课提示词技术

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

【oracle数据库安装篇二】Linux6.8基于ASM安装oracle11gR2单机

说明 本篇文章主要介绍了Linux6.8基于ASM安装oracle11gR2单机的配置过程&#xff0c;图文并茂&#xff0c;整个安装过程直观易懂&#xff0c;无论是对于初学者还是有一定经验的系统管理员&#xff0c;都能从中获得很大的帮助。 相比于上一篇【oracle数据库安装篇一】Linux5.6…

嵌入式面试-回答UART

说明&#xff1a; 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理&#xff0c;主要针对的是嵌入式软件面试中涉及到的问答&#xff0c;努力精准的抓住重点进行描述。若有不足非常欢迎指出&#xff0c;感谢&#xff01;在总结过程中有些答案没标记参考来源&…

C++算法题 - 区间

目录 228. 汇总区间56. 合并区间57. 插入区间452. 用最少数量的箭引爆气球 228. 汇总区间 LeetCode_link 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所…

Maven通过flatten-maven-plugin插件实现多模块版本统一管理

正文 起因是公司开始推代码版本管理的相关制度&#xff0c;而开发过程中经常使用多模块构建项目&#xff0c;每次做版本管理时都需要对每个模块及子模块下的pom文件中parent.version和模块下依赖中的version进行修改&#xff0c;改的地方非常多&#xff0c;且非常容易漏。为此…

衣康酸(ITA)应用领域广泛 工业发酵法为其主流制备方法

衣康酸&#xff08;ITA&#xff09;应用领域广泛 工业发酵法为其主流制备方法 衣康酸&#xff08;ITA&#xff09;又称亚甲基丁二酸、甲叉琥珀酸&#xff0c;化学式为C5H6O4&#xff0c;是一种不饱和二元有机酸。衣康酸外观呈白色结晶粉末&#xff0c;含强烈刺激性气味&#xf…

【机器学习】小波变换在特征提取中的实践与应用

小波变换在特征提取中的实践与应用 一、小波变换的基本原理与数学表达二、基于小波变换的特征提取方法与实例三、小波变换在特征提取中的优势与展望 在信号处理与数据分析领域&#xff0c;小波变换作为一种强大的数学工具&#xff0c;其多尺度分析特性使得它在特征提取中扮演着…

浅析STM32H750启动文件

目录 概述 1 启动文件介绍 1.1 启动文件功能 1.2 汇编语言指令 2 启动代码细节 2.1 分配栈空间 2.2 分配堆空间 2.3 中断向量表 2.4 复位程序 2.5 中断服务程序 2.5.1 CPU内部中断程序 2.5.2 CPU内部扩展中断程序 2.6 用户堆栈初始化 3 总结 概述 本文以startup_stm3…

基于springboot实现城镇保障性住房管理系统项目【项目源码+论文说明】

基于springboot实现城镇保障性住房管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了城镇保障性住房管理系统的开发全过程。通过分析城镇保障性住房管理系统管理的不足&#xff0c;创建了一个计算机…

Intewell-Win_V2.1.2_release版本正式发布-鸿道Intewell操作系统

Intewell-Win_V2.1.2_release版本 版本号&#xff1a;V2.1.2 版本发布类型&#xff1a;release正式版本 版本特点 修复此前版本中的授权问题 特殊说明 版本或修改说明 修改&#xff1a; 1.已授权设备用户ID直接从授权文件获取&#xff1b; 2.授权设备硬件指纹采集系统硬盘…

Odoo|手把手教你Odoo集成drools,完成物料规则配置与报价单自动审核!

一、背景介绍 在实际业务中&#xff0c;售前根据客户需求选择相应的产品和对应的物料来生成报价单。然而&#xff0c;在填写报价单的过程中&#xff0c;可能会出现物料漏选或数量不准确的情况&#xff0c;这会对后续备货和生产效率造成重大影响。此外&#xff0c;由于产品和物料…

ctfhub-ssrf(2)

1.URL Bypass 题目提示:请求的URL中必须包含http://notfound.ctfhub.com&#xff0c;来尝试利用URL的一些特殊地方绕过这个限制吧 打开环境发现URL中必须包含http://notfound.ctfhub.com&#xff0c;先按照之前的经验查看127.0.0.1/flag.php,发现没什么反应&#xff0c;按照题…

Java入门(JDK安装)

安装 JDK 下载 Java Downloads | Oracle 安装 下一步直接安装安装过程中&#xff0c;需要确定自己的安装位置 参考&#xff1a;D:\Java\jdk1.8.0_281_x64 演示位置 校验 终端输入 java -version 配置 1&#xff09;删除默认 javapath 默认情况下&#xff0c;可以在cm…

04 JavaScript学习:输出

JavaScript 没有任何打印或者输出的函数。 JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据&#xff1a; 使用 window.alert() 弹出警告框。使用 document.write() 方法将内容写到 HTML 文档中。使用 innerHTML 写入到 HTML 元素。使用 console.log() 写入到浏…

【GoWeb框架初探————Gin篇】

1. Gin 1.1 下载相应依赖 创建go项目&#xff0c;在项目下建立go.mod文件&#xff08;若有则跳过&#xff09; 命令行运行 go get github.com/gin-gonic/gin1.2 启动一个简单Web服务 package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/…

新手入门:大语言模型训练指南

在这个信息爆炸的时代&#xff0c;人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能手机上的语音助手到自动驾驶汽车&#xff0c;AI的应用无处不在。而在这些令人惊叹的技术背后&#xff0c;大语言模型&#xff08;LLM&#xff09;扮演着至关重要的角色。它们不…