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. 爱心跳动效果 CSS实现

    爱心跳动效果 CSS实现 实现效果 砰砰砰 实现原理 通过动画改变每个元素的高度,从而实现每个元素高度变化的效果,为了使每个元素依次跳动,给每个元素添加一定的延时效果,使得从效果元素依次跳动 代码分析 ...

  2. [leetcode] 875. 爱吃香蕉的珂珂(周赛)

    875. 爱吃香蕉的珂珂 这题时间要求比较严格... 首先,将piles排序,然后二分查找. 总之,答案K肯定位于piles[?]piles[?+1]或者1piles[0]之间 所以我们先二分把?找到 ...

  3. GO语言基础---值传递与引用传递

    package main import ( "fmt" ) /* 值传递 函数的[形式参数]是对[实际参数]的值拷贝 所有对地址中内容的修改都与外界的实际参数无关 所有基本数据类型 ...

  4. Python+Selenium - 鼠标操作

    鼠标操作类:action_chains模块的ActionChains类 使用组成:操作 + 执行(perform()) 导入代码 from selenium.webdriver.common.acti ...

  5. springboot打包上线

    发布到线上的包结构 runtime是发布到线上的目录结构 1.项目pom.xml添加打包配置 <build> <plugins> <plugin> <grou ...

  6. 5G通讯与芯片

    5G通讯与芯片 美国商务部可能接近达成一项新的规则,允许美国公司与华为重启谈判,在共同制定下一代通信技术5G标准方面进行合作. 华为美国首席安全官安迪·珀迪(Andy Purdy)向第一财经记者独家回 ...

  7. 先进一站式IP及定制

    先进一站式IP及定制 芯动科技15年来立足中国本土,目前已实现从130nm到5nm工艺高速混合电路IP核全覆盖,且所有IP均自主可控,一站式赋能国产芯片发展. 提供经过批量生产验证或硅验证的IP产品, ...

  8. TensorFlow文本情感分析实现

    TensorFlow文本情感分析实现 前面介绍了如何将卷积网络应用于图像.本文将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句子或文档表示为矩阵,则该矩阵与其中每个单元 ...

  9. Harmony生命周期

    Harmony生命周期 系统管理或用户操作等行为,均会引起Page实例在其生命周期的不同状态之间进行转换.Ability类提供的回调机制能够让Page及时感知外界变化,从而正确地应对状态变化(比如释放 ...

  10. linux环境下jmeter安装和运行

    linux环境部署: 在Linux服务器先安装jdk:2.以jdk-8u172-linux-x64.tar.gz为例:下载地址:http://www.oracle.com/technetwork/ja ...