Hash 模式

URL中 # 后面的内容作为路径地址,可以通过location.url直接切换路由地址,如果只改变了#后面的内容,浏览器不会向服务器请求这个地址,会把这个地址

记录到浏览器的访问历史中,当hash发生改变之后会触发hashchange事件,在hashchange事件中记录当前的路由地址,并找到该路径对应的组件并重新渲染。

History 模式

History模式就是一个普通的url,通过history.pushState()方法仅仅改变地址栏,并把地址栏中的地址添加到访问历史中,通过监听popstate事件可以监听浏览器

数据的变化,此时不会向服务器发送请求,只有当刷新页面或者点击浏览器前进后退按钮的时候该事件才会被触发向浏览器发送请求。

VueRouter的模拟实现分析

上图中为vuerouter前端调用的核心代码,Vue.use方法可以传入函数或者对象,如果传入函数Vue.use会调用这个函数,如果传入对象的话,Vue.use会

调用里面的install方法,VueRouter是个对象,所以后续要实现一个install方法。router为new VueRouter一个对象实例,所以VueRouter为一个构造函数

或者一个类,我们以类的方式来实现,VueRouter这个类里面有个静态的install方法,里面传入了一个对象的形式,里面传入了路由的路径及对应的组件

,然后在main.js中创建Vue实例,传入router对象。

上图为VueRouter的类图,有了这个类图,下面我们要做的就是实现类中的属性和方法。这个类图有三部分,最上面是类的名字VueRouter,第二部分是类的

属性,第三部分是类的方法。其中第二部分options属性的作用为记录构造函数中传入的对象,routerMap用来记录路由地址和组件的对应关系,会把路由

规则解析到RouterMap中来(后续代码解析),data是一个对象,里面有一个属性current,用来记录路由地址,设置data的目的是我们需要一个响应式的

对象,因为路由地址发生改变,对应的组件要更新。第三部分对应的方法,前面+号是对外公开的方法,_是静态的方法。_install就是静态方法,它是实

现vue的插件机制,Constructor初始化VueRouter中的属性,init把不同的代码分割到不同的方法中实现,调用上图中init方法下面的三个方法,initEvent

方法监听浏览器历史的变化,CreateRouteMap方法初始化routerMap属性的,把构造函数中传入的路由规则转化为键值对的形式存储到RouteMap中。

initComponents这个方法是用来创建router-link和router-view这两个组件的。

一.VueRouter中的静态方法install

首先,install方法要做3件事情:

1.判断当前插件是否已经被安装,如果已经安装则return

2.把Vue构造函数记录到全局变量

3.把创建Vue实例时候传入的router对象注入到Vue实例上

二.VueRouter构造函数 

Constructor构造函数接收一个参数options,是一个对象,要初始化3个属性,options,data,routeMap。

三.createRouteMap方法实现

作用是将构造函数中传入过来的Options中的路由规则转化成键值对的形式传入到routeMap中去.

四.initComponents方法实现

创建router-link和router-view组件,首先要说下Vue的构建版本分为运行时版本和完整版,运行时版本不支持template模板,

需要打包时候提前编译完整版本:包含运行时和编译器,体积比运行时版本大10K左右,程序运行的时候需要把模板转换成render函数。Vue-cli使用的是

运行时的版本,所以使用template模板会报错,所以可以把template转化为render函数。

五.initEvent方法实现

作用:点击浏览器前进和后退,没有加载对应的组件,所有要处理当历史发生变化时,要加载对应的组件把它渲染出来。

六.init方法实现

作用:封装initEvent,initComponents,createRouteMap方法

Vue Router的原理及history模式源码实现的更多相关文章

  1. 「进阶篇」Vue Router 核心原理解析

    前言 此篇为进阶篇,希望读者有 Vue.js,Vue Router 的使用经验,并对 Vue.js 核心原理有简单了解: 不会大篇幅手撕源码,会贴最核心的源码,对应的官方仓库源码地址会放到超上,可以配 ...

  2. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  3. HashMap实现原理(jdk1.7),源码分析

    HashMap实现原理(jdk1.7),源码分析 ​ HashMap是一个用来存储Key-Value键值对的集合,每一个键值对都是一个Entry对象,这些Entry被以某种方式分散在一个数组中,这个数 ...

  4. select用法&原理详解(源码剖析)(转)

    今天遇到了在select()前后fd_set的变化问题,查了好久终于找到一个有用的帖子了,很赞,很详细!!原文链接如下: select用法&原理详解(源码剖析) 我的问题是: 如下图示:在se ...

  5. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  6. 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)

    [1]前言 本篇幅是对 线程池底层原理详解与源码分析  的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...

  7. vue系列---响应式原理实现及Observer源码解析(一)

    _ 阅读目录 一. 什么是响应式? 二:如何侦测数据的变化? 2.1 Object.defineProperty() 侦测对象属性值变化 2.2 如何侦测数组的索引值的变化 2.3 如何监听数组内容的 ...

  8. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

  9. C# Socket-TCP异步编程原理详解附源码

    目录 目录异步原理主要方法源码Server源码:Client源码实验效果(广播为例)参考博客 TOC 异步原理 套接字编程原理:延续文件作用思想,打开-读写-关闭的模式. C/S编程模式如下: Ø 服 ...

随机推荐

  1. MVC、MVP和MVVM的区别

    前言 在web1.0时代时,那个时候程序猿还没有前后端之分,更程序员开发的时候,都是要前后端一起写的,前后端的代码都是杂揉在一起,如图下 这种开发模式的话,开发的时候因为不需要和其他人员沟通协作,前后 ...

  2. 写Bug时,需要注意的几点 02

    重构2-重新组织函数 重构的基本技巧--小步前进,频繁测试. 模式是你希望到达的目标,重构则是到达之路. 在单进程软件中,你永远不必操心多么频繁地调用某个函数,因为函数的调用成本很低.但在分布式软件中 ...

  3. 深入浅出Promise

    Abstract Promise的意思是承诺(在红宝书中翻译为期约),新华字典:(动)对某项事务答应照办. Promise最早出现在Commn JS,随后形成了Promise/A规范. Promise ...

  4. TVM性能评估分析(五)

    TVM性能评估分析(五) Figure 3.  A futher speed up with operator fusion Table 1.  Performance issue of cuBLAS ...

  5. 视觉SLAM的主要功能模块分析

    视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...

  6. JUC 并发编程--01,线程,进程,经典卖票案例, juc的写法

    进程: 就是一个程序, 里面包含多个线程, 比如一个QQ程序 线程: 进程中最小的调度单元, 比如 QQ中的自动保存功能 并发: 多个线程操作同一资源, 抢夺一个cpu的执行片段, 快速交替 并行: ...

  7. 【Java实现】剑指offer53.1——在排序数组中查找数字(LeetCode34:在排序数组中查找元素的起始位置)

    序数组中查找元素的起始位置):思路分享 <剑指offer>题目和LeetCode主站本质是一样的,想要找到target数目,也需要找到左右边界 题目解析: 在一个排序数组中,找到targe ...

  8. java后端知识点梳理——JVM

    可以先看看我的深入理解java虚拟机笔记 深入理解java虚拟机笔记Chapter2 深入理解java虚拟机笔记Chapter3-垃圾收集器 深入理解java虚拟机笔记Chapter3-内存分配策略 ...

  9. 【NX二次开发】UF_OBJ_ask_display_properties获取对象所在层、获取对象颜色、获取对象是否隐藏、获取对象是否高亮,获取对象线宽、字体大小

    UF_OBJ_ask_display_properties 返回一个对象的显示属性(层.颜色.隐藏状态.线宽和字体). UF_OBJ_disp_props_p_t结构体: layer int 对象所在 ...

  10. 【SQLite】SQLite文件突然变大怎么办?瘦身办法

    使用VACUUM命令即可: VACUUM 命令通过复制主数据库中的内容到一个临时数据库文件,然后清空主数据库,并从副本中重新载入原始的数据库文件.这消除了空闲页,把表中的数据排列为连续的,另外会清理数 ...