经过上一节分析,我们知道vueRouter向组件的beforeCreate中混入了相关逻辑,并执行了一些初始化工作
我们知道,路由在执行安装过程中会向install函数挂载静态属性installed,若不存在则说明没有被调用,那么极大可能是用户未使用vue.use注入路由
this.apps中保存着所有的组件实例,这是因为路由是可以有多个实例的,这意味着我们可以在特定的组件加载时去注册一些路由。每次都会调用constructor执行一些初始化工作
首先调用createMatcher去创建一组路由操作相关的api,这利用闭包将操作接口进行保留
根据指定的history参数获取不同的实例,对于不支持history模式的浏览器降级为hash模式
app.$once则是vue事件中心的方法之一,它与$on的不同在于,每次执行后都会手动调用$off执行销毁
我们知道,$on的过程实际上是向组件实例上标记_events属性,并在$emit阶段对_events进行遍历执行,因此我们只需要找到$emit('hook:destroyed')的执行时机即可
我们知道callhook函数就是vue提取出来在组件的各个时机执行钩子函数的方法
又知,在不同的阶段hookName不同,在销毁阶段为destory,命中$emit('hook:destroyed')。执行路由的销毁工作
从apps中销毁组件
从history中销毁路由
返回到init函数,当为history或hash模式时,调用transitionTo进行路由过度并调用listen监听路由改变。其中history则是在初始化过程中获取的history实例,对于浏览器而言,只支持hash和history两种模式