react-router 源码之matchPath方法

1. 基础依赖path-to-regexp

react-router提供了专门的路由匹配方法matchPath(位于packages/react-router/modules/matchPath.js),该方法背后依赖的其实是path-to-regexp包。

path-to-regexp输入是路径字符串(也就是Route中定义的path的值),输出包含两部分
● 正则表达式(re)
● 一个数组(keys)(用于记录param的key信息)

2. matchPath核心

matchPath方法首先通过path-to-regexp的方法来获取Route上定义的path对应的正则,再将生成的正则表达式与url中的pathname做正则匹配判断是否匹配。
把地址中的路径和属性中的path进行匹配,返回匹配结果

let pathToRegExp = require('path-to-regexp');
function compilePath(path, options) {const keys = [];const regexp = pathToRegExp(path, keys, options);return { keys, regexp };
}
/*** 把地址中的路径和属性中的path进行匹配,返回匹配结果 * @param {*} pathname  地址中的路径* @param {*} options 属性对象*/
function matchPath(pathname, options = {}) {// exact 是否精确匹配 sensitive 是否大小写敏感let { path = "/", exact = false, strict = false, sensitive = false } = options;let { keys, regexp } = compilePath(path, { end: exact, strict, sensitive });let match = regexp.exec(pathname);if (!match) return null;const [url, ...groups] = match;//pathname=/user/list  regxp =/\/user/ url=/userconst isExact = pathname === url;//是否完整匹配url路径return {path,//Route 里的路径url,//正则匹配到的浏览器路径的部分isExact,// 是否精确匹配params: keys.reduce((memo, key, index) => {//路径参数对象memo[key.name] = groups[index];return memo;}, {})}}
export default matchPath;

3.route 渲染

在这里插入图片描述

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

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

相关文章

Ansible的playbook的编写和解析

目录 什么是playbook Ansible 的脚本 --- playbook 剧本 实例部署(使用playbook安装启动httpd服务) 1.编写一个.yaml文件 在主机下载安装http,将配置文件复制到opt目录下 运行playbook 在192.168.17.77主机上查看httpd服务是否成功开启…

3,设备无关位图显示

建立了一个类Dib Dib.h #pragma once #include “afx.h” class CDib :public CObject { public: CDib(); ~CDib(); char* GetFileName(); BOOL IsValid(); DWORD GetSize(); UINT GetWidth(); UINT GetHeight(); UINT GetNumberOfColors(); RGBQUAD* GetRGB(); BYTE* GetDat…

探讨javascript的程序性能

如果阅读有疑问的话,欢迎评论或私信!! 本人会很热心的阐述自己的想法!谢谢!!! 文章目录 Web WorkerWorker之间通讯Worker销毁 Web Worker 当我们需要处理一些比较耗时的任务时,我们…

【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug

目录 前言 行断点 条件断点 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时,如果能确定大致的代码段,就可以在相应的行上设置一个断点(Breakpoint)&…

java-ssm-jsp广播剧制作订阅系统

java-ssm-jsp广播剧制作订阅系统 获取源码——》公主号:计算机专业毕设大全

Jmeter压力测试指标

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 RT(response time) 什么是RT? RT就是指系统在接收到请求和做出相应这段时间跨度 但是值得一提…

谈谈高并发系统的设计方法论

何为高并发系统? 在理解高并发系统之前,我们先来理解几个相关概念。 什么是并发(Conurrent)? 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同…

记录SSM项目集成Spring Security 4.X版本 之 加密验证和记住我功能

目录 前言 一、用户登录密码加密认证 二、记住我功能 前言 本次笔记的记录是接SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示-CSDN博客https://blog.csdn.net/u011529483/article/details/136255768?spm1001.2014.3001.5502 文章之后补…

滑动窗口刷题(四)困难

目录 串联所有单词的子串 1.题目解析 2.算法思路 3.代码编写 1.题目解析 例:如果 s "barfoothefoobarman" word ["foo","bar"] 那么就去s中寻找"foobar"或者"barfoo",返回找到字串的起始位置。 s "…

计算机二级MySQL-错题、知识点合集04

计算机二级MySQL 第四章 索引 主键约束,不允许为空也不允许重复。 NOT NULL非空约束属于自定义完整约束 PRIMARY KEY 属于实体完整性约束 FOREIGN KEY外键约束 外键与其引用的主键应分别属于不同的表,可以属于同一个关系;一个关系中可以定…

回溯例题(leetcode17/37)

文章目录 leetcode37leetcode17 回溯跟枚举差不多。要注意“回溯”,别忘记“回”之前把之前的改动都复原。 leetcode37 leetcode37是解数独问题。本题保证有且仅有唯一解。 思路:先把空格子的位置存下来,然后对每一个空位置挨个枚举1-9。枚…

spring boot 实现定时任务(Spring Task)

spring boot 实现定时任务(Spring Task) 一、Spring Task介绍 从Spring 3开始,Spring自带了一套定时任务工具Spring-Task,可以把它看成是一个轻量级的Quartz,使用起来十分简单,除Spring相关的包外不需要额…