本节简单介绍类 VueRouter
由章节一可知已通过 Vue.use(plugin) 函数注册插件,由章节二可知通过 plugin.install() 函数进行安装路由插件,呢么接下来看一下 VueRouter 类。
VueRouter 类源码的入口文件是 /src/index.js,在该文件内定义了 VurRouter 类,呢么接下来简单分析一下该类的构造函数,看看在实例化的时候是如何执行的。
构造函数
上图显示路由实例化的写法,呢么我们就来分析一下路由的构造函数,暂时不上源码,请自行查看比对。
在构造函数内如下:
- 在该函数内
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() 函数在生命周期钩子函数内混入以下代码,当实例化时会执行该生命周期钩子函数,该函数如下图所示:
由上图可知,在生命周期钩子函数内当为根实例时则执行路由实例 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() 函数。