vue-router源码解读--init过程

目录导航

经过上一节分析,我们知道vueRouter向组件的beforeCreate中混入了相关逻辑,并执行了一些初始化工作

vue-router源码解读--init过程_第1张图片

我们知道,路由在执行安装过程中会向install函数挂载静态属性installed,若不存在则说明没有被调用,那么极大可能是用户未使用vue.use注入路由

this.apps中保存着所有的组件实例,这是因为路由是可以有多个实例的,这意味着我们可以在特定的组件加载时去注册一些路由。每次都会调用constructor执行一些初始化工作

vue-router源码解读--init过程_第2张图片

        首先调用createMatcher去创建一组路由操作相关的api,这利用闭包将操作接口进行保留

        根据指定的history参数获取不同的实例,对于不支持history模式的浏览器降级为hash模式

app.$once则是vue事件中心的方法之一,它与$on的不同在于,每次执行后都会手动调用$off执行销毁

vue-router源码解读--init过程_第3张图片

        我们知道,$on的过程实际上是向组件实例上标记_events属性,并在$emit阶段对_events进行遍历执行,因此我们只需要找到$emit('hook:destroyed')的执行时机即可

        我们知道callhook函数就是vue提取出来在组件的各个时机执行钩子函数的方法

vue-router源码解读--init过程_第4张图片

        又知,在不同的阶段hookName不同,在销毁阶段为destory,命中$emit('hook:destroyed')。执行路由的销毁工作        

vue-router源码解读--init过程_第5张图片

        从apps中销毁组件

        从history中销毁路由

返回到init函数,当为history或hash模式时,调用transitionTo进行路由过度并调用listen监听路由改变。其中history则是在初始化过程中获取的history实例,对于浏览器而言,只支持hash和history两种模式

你可能感兴趣的:(vue-router源码解读--init过程)