三、VueRouter 实例化

268 阅读2分钟

本节简单介绍类 VueRouter

章节一可知已通过 Vue.use(plugin) 函数注册插件,由章节二可知通过 plugin.install() 函数进行安装路由插件,呢么接下来看一下 VueRouter 类。

VueRouter 类源码的入口文件是 /src/index.js,在该文件内定义了 VurRouter 类,呢么接下来简单分析一下该类的构造函数,看看在实例化的时候是如何执行的。


构造函数

image.png

上图显示路由实例化的写法,呢么我们就来分析一下路由的构造函数,暂时不上源码,请自行查看比对。

在构造函数内如下:

  • 在该函数内 this 为路由实例
  • 定义 this.app = null; this.apps = []; 用以缓存 Vue 实例
  • 定义 this.options = options; 保存实例化时的路由配置
  • 定义 this.beforeHooks、this.resolveHooks、this.afterHooks 缓存钩子函数
  • 定义 this.matcher = createMatcher(options.routes || [], this); 表示路由匹配器,后续会简单讲解。
  • 定义 this.fallback 表示在浏览器不支持 history.pushState 的情况下,根据传入的 fallback 配置参数,决定是否回退到 hash 模式
  • 定义 this.mode 表示路由创建的模式:history/hash/abstract
  • 定义 this.history 表示路由历史的具体的实现实例,它是根据 this.mode 的不同实现不同的路由实例,它有 History 基类,然后不同的模式实现都是继承 History 类。

最后返回路由 router 实例。


init() 函数

在实例化 VueRouter 类后会返回 router 实例,然后在实例化 new Vue({router,...}) 时会传入作为配置属性。由章节二可知,通过 Vue.mixin() 函数在生命周期钩子函数内混入以下代码,当实例化时会执行该生命周期钩子函数,该函数如下图所示:

image.png

由上图可知,在生命周期钩子函数内当为根实例时则执行路由实例 router.init(this) 函数,呢么接下啦重要分析一下该函数,暂时不上源码,请自行比对。

init(app) 函数内:

  • 由于是根实例才会执行该函数,所以 app 表示为根 Vue 实例,且在该函数内 this 为路由实例
  • 执行 this.apps.push(app); 缓存到属性 this.apps
  • this.app 有值,即已经赋值已经执行该函数,则直接 return;否则执行 this.app = app; 进行赋值,所以 this.app 表示为根实例
  • 获取到 this.history 属性进行判断,若是 history/hash 路由则会执行 history.transitionTo() 函数,否则略过此处。
  • 最后执行 history.listen() 函数监听路由变化。

history.transitionTo() 函数内执行如下图所示代码,其实就是执行路由实例的 match() 函数。

image.png

image.png