【vue-rouer源码】系列文章

  1. 【vue-router源码】一、router.install解析
  2. 【vue-router源码】二、createWebHistory、createWebHashHistory、createMemoryHistory源码解析
  3. 【vue-router源码】三、理解Vue-router中的Matcher
  4. 【vue-router源码】四、createRouter源码解析
  5. 【vue-router源码】五、router.addRoute、router.removeRoute、router.hasRoute、router.getRoutes源码分析
  6. 【vue-router源码】六、router.resolve源码解析
  7. 【vue-router源码】七、router.push、router.replace源码解析
  8. 【vue-router源码】八、router.go、router.back、router.forward源码解析
  9. 【vue-router源码】九、全局导航守卫的实现
  10. 【vue-router源码】十、isReady源码解析
  11. 【vue-router源码】十一、onBeforeRouteLeave、onBeforeRouteUpdate源码分析
  12. 【vue-router源码】十二、useRoute、useRouter、useLink源码分析
  13. 【vue-router源码】十三、RouterLink源码分析
  14. 【vue-router源码】十四、RouterView源码分析

目录

  • 【vue-rouer源码】系列文章
  • 前言
  • 使用
  • addRoute
  • removeRoute
  • hasRoute
  • getRoutes
  • 总结

前言

【vue-router源码】系列文章将带你从0开始了解vue-router的具体实现。该系列文章源码参考vue-router v4.0.15
源码地址:https://github.com/vuejs/router
阅读该文章的前提是你最好了解vue-router的基本使用,如果你没有使用过的话,可通过vue-router官网学习下。

该篇文章将分析router.addRouterouter.removeRouterouter.hasRouterouter.getRoutes的实现。

使用

  • addRoute
    当使用addRoute添加路由时,如果第一个参数为路由name,那么会添加一个嵌套路由;否则添加的是个非嵌套路由。
// 添加非嵌套路由
router.addRoute({ name: 'admin', path: '/admin', component: Admin })
// 添加嵌套路由
router.addRoute('admin', { path: 'settings', component: AdminSettings })

以上代码等同于:

router.addRoute({name: 'admin',path: '/admin',component: Admin,children: [{ path: 'settings', component: AdminSettings }],
})
  • removeRoute
router.removeRoute('admin')
  • hasRoute
router.hasRoute('admin')
  • getRoutes
router.getRoutes()

addRoute

addRoute可接受两个参数:parentOrRoute(父路由的name或一个新的路由,如果是父路由的name,name第二个参数是必须的)、record(要添加的路由)。返回一个删除新增路由的函数。

function addRoute(parentOrRoute: RouteRecordName | RouteRecordRaw,route?: RouteRecordRaw) {let parent: Parameters<typeof matcher['addRoute']>[1] | undefinedlet record: RouteRecordRaw// 如果parentOrRoute是路由名称,parent为parentOrRoute对应的matcher,被添加的route是个嵌套路由if (isRouteName(parentOrRoute)) {parent = matcher.getRecordMatcher(parentOrRoute)record = route!} else { // 如果parentOrRoute不是路由名称,parentOrRoute就是要添加的路由record = parentOrRoute}// 调用matcher.addRoute添加新的记录,返回一个移除路由的函数return matcher.addRoute(record, parent)}

在定义parent时,使用了一个Paramerer<Type>类型,对于该类型的使用可参考https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype。在该方法中,parent的类型会取matcher.addRoute方法中的第2个参数的类型。

isRouteName:通过判断name是否为stringsymbol类型,来决定是不是routeName

export function isRouteName(name: any): name is RouteRecordName {return typeof name === 'string' || typeof name === 'symbol'
}

removeRoute

删除路由。removeRoute接收一个name(现有路由的名称)参数。

function removeRoute(name: RouteRecordName) {// 根据name获取对应的routeRecordMatcherconst recordMatcher = matcher.getRecordMatcher(name)if (recordMatcher) {// 如果存在recordMatcher,调用matcher.removeRoutematcher.removeRoute(recordMatcher)} else if (__DEV__) {warn(`Cannot remove non-existent route "${String(name)}"`)}
}

hasRoute

用于判断路由是否存在。hasRoute接收一个name字符串,返回一个boolen值。

通过matcher.getRecordMatcher来获取对应的matcher,在matcher.getRecordMatcher会在matcherMap中取寻找对应的matcher,如果没有找到说明路由不存在。

function hasRoute(name: RouteRecordName): boolean {return !!matcher.getRecordMatcher(name)
}

getRoutes

获取标准化后的路由列表。标准化后的路由会被存储到matcher.record中。

function getRoutes() {// 遍历matchers,routeMatcher.record中存储着路由的标准化版本return matcher.getRoutes().map(routeMatcher => routeMatcher.record)
}

总结

router.addRouterouter.removeRouterouter.hasRouterouter.getRoutes几个API全都依赖matcher实现,可见matchervue-router的核心,如果你不了解matcher,建议回顾下之前的文章。

【vue-router源码】五、router.addRoute、router.removeRoute、router.hasRoute、router.getRoutes源码分析相关推荐

  1. 阅读react-redux源码(五) - connectAdvanced中store改变的事件转发、ref的处理和pure模式的处理

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  2. [vue] 你了解axios的原理吗?有看过它的源码吗?

    [vue] 你了解axios的原理吗?有看过它的源码吗? 1.axios通过对Promise的封装实现异步请求: 2. if(answer == '有'){ if(这个问题到此为止){ return ...

  3. Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码)

    Adroid游戏开发实例讲解(五)-哄娃神器之随机五彩泡(附源码) 程序之美 泡泡 一直被孩子认为是神奇的东西.记得儿时,经常 趁大人不注意,偷偷抓一把洗衣粉撞到口袋里,然后自己悄悄的找来一个小瓶子, ...

  4. 【vue-router源码】十二、useRoute、useRouter、useLink源码分析

    [vue-rouer源码]系列文章 [vue-router源码]一.router.install解析 [vue-router源码]二.createWebHistory.createWebHashHis ...

  5. app商城源码_海量的SpringBoot和SSM项目【附带源码+视频教程】快速成为全栈

    为了帮助更多的小伙伴进行项目的锻炼,孟哥整理较多的实战项目,包括SSM.Springboot.Springcloud.小程序等. 各种项目还在不断的更新中--仅限制学习使用,若有侵权,请联系删除. 点 ...

  6. [附源码]计算机毕业设计Python+uniapp安卓日程管理APPqksh9(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp安卓日程管理APPqksh9(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Pyt ...

  7. 烽火推系统,探店通系统源码搭建?烽火推系统,探店通系统源码二次技术开发功能板块

    烽火推系统,探店通系统源码搭建?烽火推系统,探店通系统源码二次技术开发功能板块 烽火推,探店通系统源码如何搭建?二次技术开发功能板块有哪些?首先烽火推系统,探店通系统是基于抖音平台的系统.主要功能板块 ...

  8. 【附源码】计算机毕业设计Python安卓行程规划app7seis(源码+程序+LW+调试部署)

    [附源码]计算机毕业设计Python安卓行程规划app7seis(源码+程序+LW+调试部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置: Python3.7. ...

  9. 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

最新文章

  1. JDBC连接方式有哪几种
  2. pythontuple数据类型_Python基础教程2d–数据类型-tuple(元组)
  3. spring源码阅读(3)-- 容器启动之BeanFactoryPostProcessor
  4. 移动端页面按手机屏幕分辨率自动缩放的js
  5. 【安全】Apache HDFS 上配置 kerberos
  6. mysql创建关系模式命令_Mysql数据库介绍及mysql显示命令
  7. 静态NAT、动态NAT、PAT(端口多路复用)的配置
  8. 学习总结-《父与子的编程之旅》chapter 17
  9. Cool_gamesetup.exe山寨版熊猫烧香病毒
  10. ubuntu stardict词典安装
  11. 下行文格式图片_下行文标准模版
  12. m3u8文件下载及合并
  13. NameNode格式化——组件恢复,数据丢失
  14. 安装vim管理插件 pathogen
  15. php三D立体模拟,【HTML5】3D模型--百行代码实现旋转立体魔方实例
  16. 【大厂直通车】哔哩哔哩日常实习_测开面经
  17. java学习之SpringBoot2
  18. Android 开源OS
  19. C#之WinForms入门
  20. C#环形缓冲区(队列)完全实现(转)

热门文章

  1. word写论文时参考文献、目录以及页码设置
  2. 《调色师手册:电影和视频调色专业技法(第2版)》——数字样片:后期制作的开始...
  3. ​2021年数模国赛A题国二摘要及经验分享(回忆篇,附部分代码)
  4. linux挂载u盘显示目录忙,linux下挂载u盘及iso8859-1 not found错误解决
  5. Linux系统rar格式怎么解压,如何在linux下解压缩rar格式的文件压缩包
  6. 百度阿里网易大疆等大小厂前端校招面筋
  7. 有没有测试手机硬件是否损坏的软件,怎么检测手机硬件故障
  8. 蓝牙音箱电路板原理图_一文看懂音响电路图及工作原理
  9. 快速排序的那些事儿(Kotlin)
  10. 清除Chrome浏览器下默认浅黄色背景(保存密码时出现)