React Router底层核心原理详解
React Router 是一个功能强大的路由库,它允许开发者在 React 单页面应用(SPA)中实现客户端路由管理。React Router 通过匹配 URL 和组件的关系来实现页面的导航,它不仅提供了简单的 API,还在底层实现了复杂的 URL 匹配、路由变化管理和渲染控制。
本文将深入探讨 React Router 的底层核心原理,帮助理解它如何工作,从而能够更好地使用和定制它。
1. React Router 核心概念
React Router 的基本理念是通过 URL 和组件的映射关系来实现视图的更新,主要有以下几个关键的概念:
- 路由:每个 URL 路径都映射到一个 React 组件,用户在浏览器中访问不同的路径时,React Router 会决定展示哪个组件。
- 路由匹配:React Router 根据浏览器中的 URL 路径来决定哪些组件应该被渲染。
- 路由变化:当 URL 发生变化时,React Router 会对比新旧路径,匹配并更新渲染的组件。
React Router 是通过监听浏览器的 URL 变化、更新组件来实现 SPA(单页面应用)的路由控制。下面我们将从底层了解 React Router 如何工作。
2. React Router 的核心原理
2.1 路由匹配机制
React Router 的核心部分是如何进行路由匹配。路由匹配的核心思想是通过比较当前的 URL 路径和定义的路由路径,然后决定渲染哪个组件。
- 路径匹配:React Router 使用路径和组件进行映射。
<Route>组件的path属性用于定义路径,当 URL 路径与某个Route的path匹配时,React Router 会渲染该路由对应的组件。 - 动态参数匹配:React Router 支持动态路由,例如
/post/:id。动态路由会匹配路径中的参数,useParams钩子可以帮助获取这些动态参数。
路由匹配流程:
- 获取当前 URL:React Router 会通过
window.location获取当前浏览器的 URL。 - 匹配路由:React Router 会从定义的路由规则(例如
<Route path="/" />)中查找与当前 URL 路径匹配的路由。 - 渲染组件:一旦匹配到某个路由,React Router 会渲染该路由对应的组件。如果存在嵌套路由,父路由会渲染子路由。
在 v6 中,React Router 引入了 useRoutes 钩子,使得路由配置更加灵活。它接受一个路由配置对象,并根据当前路径匹配并渲染组件。
2.2 History 对象
React Router 是通过 history 对象来管理路由变化的。history 对象封装了 URL 路径的操作,使得 React Router 能够响应浏览器的 URL 变化,并实现浏览器后退、前进等操作。
- History API:React Router v4 和 v5 默认使用
historyAPI。它使用浏览器的history.pushState和history.replaceState来改变 URL,而不重新加载页面。 - HashRouter:如果使用
HashRouter,则 URL 会使用#符号来分隔路径,通常用于不支持historyAPI 的环境。
React Router 会监听 history 对象的变化,并根据 URL 变化来重新渲染匹配的路由组件。
2.3 BrowserRouter 和 HashRouter 的工作原理
-
BrowserRouter:BrowserRouter使用 HTML5 的historyAPI,直接修改浏览器的历史记录。当你使用BrowserRouter时,路径会更新为真实的路径(例如/about),浏览器不会重新加载页面,而是通过 JavaScript 管理 URL 的变化。 -
HashRouter:HashRouter使用 URL 的哈希部分(即#后面的部分)来保存路径。HashRouter适用于无法使用 HTML5 历史 API 的环境,例如一些旧版浏览器或者文件协议。
2.4 渲染过程
React Router 利用 React 的虚拟 DOM 和组件生命周期来管理组件的渲染。当 URL 发生变化时,React Router 会通过以下步骤来处理视图的更新:
- 匹配 URL:React Router 会检查当前的 URL 是否与某个路由匹配。如果匹配,则渲染对应的组件。
- 更新组件树:React Router 会更新对应的组件树。在 React 中,路由组件本身也是普通的 React 组件,因此它们会在 URL 变化时触发
render或componentDidUpdate等生命周期方法。 - 嵌套路由:对于嵌套路由,父组件会渲染子路由。React Router 会查找父路由组件中的
Outlet组件并渲染对应的子路由组件。
2.5 路由切换与渲染优化
React Router 使用了 React 的更新机制来处理路由切换时的渲染。每当路由发生变化时,React Router 会通过比较新旧 URL 来确定哪些部分需要重新渲染。
- 优化渲染:React Router 会确保每次路由切换时,只会重新渲染需要更新的组件。如果某些组件已经被渲染过,且没有发生变化,它们会被复用。
Switch和Routes:Switch(v5)和Routes(v6)用于包裹多个路由,当 URL 变化时,它们会查找第一个匹配的路由并渲染它们。只有匹配的第一个路由会被渲染,避免了多次渲染的问题。
3. React Router v6 的底层原理
在 React Router v6 中,虽然 API 上做了很多简化和改进,但底层的核心原理与 v5 基本类似。以下是 v6 中的一些关键变化:
3.1 useRoutes:配置路由的对象化方式
React Router v6 引入了 useRoutes,它使得路由配置更加灵活和动态。useRoutes 接受一个路由配置对象,根据当前的 URL 动态渲染匹配的路由。
const routes = [{path: "/",element: <Home />,},{path: "/about",element: <About />,},
];function App() {let element = useRoutes(routes);return element;
}
底层原理:
useRoutes会根据当前 URL 查找匹配的路由,返回匹配的路由组件。- 路由配置是以树形结构存储的,React Router 会从根路由开始,递归匹配路径,找到第一个匹配的路由。
3.2 去掉 exact 和 Switch
在 v6 中,所有路由默认都是精确匹配的,因此不再需要 exact 属性。而且,Switch 被 Routes 替代,Routes 确保只有第一个匹配的路由会被渲染。
exact属性的移除简化了路由的匹配逻辑。Routes会根据路径顺序渲染匹配的第一个路由,避免了多余的匹配。
3.3 Outlet 用于嵌套路由
Outlet 用于在父路由组件中渲染子路由,它是 React Router v6 的一个新特性。在嵌套路由的场景中,父组件通过 Outlet 来指定渲染子组件的位置。
const Dashboard = () => {return (<div><h2>Dashboard</h2><Outlet /> {/* 渲染子路由 */}</div>);
};
3.4 编程式导航
React Router v6 提供了 useNavigate 钩子,取代了 v5 中的 history.push 和 history.replace。这使得在函数组件中进行导航变得更加简洁。
import { useNavigate } from 'react-router-dom';const SomeComponent = () => {const navigate = useNavigate();const handleClick = () => navigate('/about');return <button onClick={handleClick}>Go to About</button>;
};
4. 总结
React Router 底层的核心原理围绕着以下几个关键点:
- 路由匹配:通过 URL 路径与路由配置进行匹配,决定渲染哪个组件。
historyAPI:通过监听浏览器的历史记录来管理路由变化。- 虚拟 DOM 更新:通过 React 的更新机制,在路由变化时高效
地更新组件。
- 嵌套路由:通过
Outlet组件来支持父子路由的嵌套渲染。 - 优化渲染:只重新渲染需要更新的组件,提升性能。
理解这些底层原理,能够帮助你更好地使用 React Router,并且在遇到复杂路由需求时,能够更灵活地调整和优化路由配置。
相关文章:
React Router底层核心原理详解
React Router 是一个功能强大的路由库,它允许开发者在 React 单页面应用(SPA)中实现客户端路由管理。React Router 通过匹配 URL 和组件的关系来实现页面的导航,它不仅提供了简单的 API,还在底层实现了复杂的 URL 匹配…...
linux MySQL 实时性能监控工具
在 Linux 上,有多个工具可以用于 实时监控 MySQL 的性能。根据你的需求,以下是常用的 MySQL 实时性能监控工具,包括轻量级的命令行工具和可视化监控工具。 🔧 1. MySQLTuner – 一键性能优化建议 ✅ 特点 快速分析 MySQL 的性能…...
ModuleNotFoundError: No module named ‘setuptools_rust‘ 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
基于Spring Boot的海滨体育馆管理系统的设计与实现
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 宠物医院…...
【机器视觉】OpenCV 图像轮廓(查找/绘制轮廓、轮廓面积/周长、多边形逼近与凸包、外接矩形)
文章目录 7. 图像轮廓7.1 什么是图像轮廓7.2 查找轮廓7.3 绘制轮廓7.4 轮廓的面积和周长7.5 多边形逼近与凸包7.6 外接矩形 OpenCV官网 7. 图像轮廓 7.1 什么是图像轮廓 图像轮廓是具有相同颜色或灰度的连续点的曲线. 轮廓在形状分析和物体的检测和识别中很有用。 轮廓的作用…...
深入浅出:React 前端框架解析与应用
引言 随着前端开发技术的不断发展,现代化的前端框架成为了提升开发效率、优化用户体验和构建复杂应用的关键工具。在众多的前端框架中,React凭借其简洁、高效、可扩展的特点,已成为目前最流行的前端框架之一。它由Facebook于2013年发布&…...
【网络安全设备系列】7、流量监控设备
0x00 定义: 网络流量控制是一种利用软件或硬件方式来实现对电脑网络流量的控制。它的最主要方法,是引入QoS的概念,从通过为不同类型的 网络数据包标记,从而决定数据包通行的优先次序。 0x01 类型: 流控技术分为两种: 一种是…...
qemu解析qcow文件
旧的 QEMU 图像格式,支持备份文件、紧凑图像文件、加密和压缩。 backing_file 基础镜像的文件名(参见create子命令) encryption 此选项已弃用,相当于encrypt.formataes encrypt.format 如果设置为aes,则图像将使用 128…...
免费网站源码下载指南:如何安全获取并降低开发成本
许多开发者或是需要建立网站的人,可以方便地获取免费网站源码。这样的下载能帮助他们降低开发费用,迅速构建起基本框架。但在此过程中,仍有许多需要注意的事项。 许多开发者或是需要建立网站的人,可以方便地获取免费网站源码。这…...
【Ubuntu】如何设置 Ubuntu 自动每日更新:轻松保持系统安全
如何设置 Ubuntu 自动每日更新:轻松保持系统安全 大家好!今天我们来聊一个非常实用的话题——如何让 Ubuntu 系统自动每日更新。如果你是一个 Ubuntu 用户,尤其是服务器管理员,你可能会经常遇到这样的问题:系统需要频…...
江科大STM32入门——UART通信笔记总结
wx:嵌入式工程师成长日记 1、简介 简单双向串口通信有两根通信线(发送端TX和接收端RX)TX与RX要交叉连接当只需单向的数据传输时,可以只接一根通信线当电平标准不一致时,需要加电平转换芯片 传输模式:全双工;时钟&…...
github gitbook写书
github创建新的仓库 在仓库中添加目录 ‘SUMMARY.md # Summary * [简介](README.md)gitbook 新建一个site https://www.gitbook.com/ 注册账号 取名字 一路 next,注意选免费版 最后 gitbook同步到github 你在主页可以看到 刚刚的test网站 点击右上角圈出来…...
探秘MetaGPT:革新软件开发的多智能体框架(22/30)
一、MetaGPT 引发的 AI 变革浪潮 近年来,人工智能大模型领域取得了令人瞩目的进展,GPT-3、GPT-4、PaLM 等模型展现出了惊人的自然语言处理能力,仿佛为 AI 世界打开了一扇通往无限可能的大门。它们能够生成流畅的文本、回答复杂的问题、进行创…...
【优选算法】Binary-Blade:二分查找的算法刃(下)
文章目录 1.山脉数组的峰顶索引2.寻找峰值3.寻找旋转排序数组中的最小值4.点名希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇接上一篇二分查找,主要通过部分题目熟悉二分查找的进阶使用,重点强调二段性,…...
Improving Language Understanding by Generative Pre-Training GPT-1详细讲解
Improving Language Understanding by Generative Pre-Training 2018.06 GPT-1 0.有监督、半监督、无监督 CV:ImageNet pre-trained model NLP:pre-trained model? 在计算机视觉中任务包含分类、检测、分割,任务类别数少,对应…...
分治算法——优选算法
本章我们要学习的是分治算法,顾名思义就是分而治之,把大问题分为多个相同的子问题进行处理,其中我们熟知的快速排序和归并排序用的就是分治算法,所以我们需要重新回顾一下这两个排序。 一、快速排序(三路划分…...
EtherCAT转Modbus网关与TwinCAT3的连接及配置详述
在工业自动化控制系统中,常常需要整合不同的通信协议设备。本案例旨在展示如何利用捷米特JM-ECT-RTU协议转换网关模块,实现 EtherCAT 网络与 Modbus 设备之间的无缝连接,并在 TwinCAT3 环境中进行有效配置,以构建一个稳定可靠的自…...
Apache Hadoop YARN框架概述
一、YARN产生和发展简史 1.1背景 数据、程序、运算资源(内存、CPU)三者组在一起,才能完成数据的计算处理过程。在单机环境下,三者之间协调配合不是太大问题。为了应对海量数据的处理场景,Hadoop软件出现并提供了分布…...
三甲医院等级评审八维数据分析应用(八)--数据治理的持续改进与反馈机制篇
一、引言 1.1 研究背景与意义 当前三甲医院在数据管理方面暴露出诸多棘手问题。一方面,数据治理缺乏系统性与规范性,数据标准不统一,不同科室、信息系统之间的数据格式各异、编码混乱,导致数据整合与共享困难重重,严重制约了数据分析的准确性与深度。以某三甲医院为例,…...
XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传
代码结构说明 这段代码的主要功能是: 从指定文件夹中读取所有 XML 文件。 将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。 处理服务器的响应,并记录每个文件的处理结果。 using System; using System.IO; using System.Net; usin…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!
【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
