You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// determine current view depth, also check to see if the tree// has been toggled inactive but kept-alive.letdepth=0letinactive=falsewhile(parent&&parent._routerRoot!==parent){if(parent.$vnode&&parent.$vnode.data.routerView){depth++}if(parent._inactive){inactive=true}parent=parent.$parent}data.routerViewDepth=depth// render previous view if the tree is inactive and kept-aliveif(inactive){returnh(cache[name],data,children)}constmatched=route.matched[depth]
写得比较匆忙,history、路由调度没有完成,未完待续...
路由安装(install)
路由安装利用了Vue.minxin全局注册了生命周期钩子,以及处理一些运行时的逻辑
路由安装阶段,注册了很多运行时的逻辑,其中包括了
路由初始化
1. 初始化matcher
a. 初始化matcher的第一步,先对用户的路由表(routers)进行处理
递归处理返回三个数据:
分别对应下面三种结构:
b. 创建match函数(用于后续的实时匹配)
match 函数是一个闭包,处于 createMatcher 作用域内,所以可以使用第一步处理routes产生的三个数据结构
match主要逻辑分为两个分支:
match函数返回值为route,由createRoute函数返回,究竟返回什么结构呢?
这个结构就是真实的路由结果,除了包括路由的初始参数和元信息外,还有用户参数数据、全路径、匹配结果等信息
在创建route的过程中,最重要的一个环节就是获取record匹配结果:
formatMatch来获取匹配结果,我们来见识一下
原来这里逻辑这么简单,关键点在于创建路由record的时候,子路由保存了父级路由的引用,通过循环我们一步一步找到这个路由的所有上层路由的record,对于返回结果的顺序,是父辈在左子辈在右,这个顺序对于匹配组件在router-view的渲染至关重要,因为我们知道,vue-router的渲染规则是根据router-view的嵌套深度决定的,这个嵌套深度与匹配结果是一致的。
这里我们直接跳到router-view组件里面一探究竟,来印证一下:
上面的代码就是router-view组件的实现逻辑,我们发现组件渲染时,通过对父辈组件的遍历来识别是否有父辈router-view组件,一直遍历到routerRoot,得到的深度depth,就是当前router-view组件的深度,最后通过depth为下标取出匹配结果种的目标结果,到这里,真实需要渲染的组件也就得到了。
初始化History
history有三种模式:
前两种常见与浏览器,提供的api:
导航方式:
运行时
history驱动路由的匹配和渲染:
匹配成功后更新当前激活的路由记录record,由于在router在安装时已经订阅了route的响应式属性,所以有使用route的组件(router-view或其他)在渲染过成功也被成功的订阅(依赖收集),所以当路由修改时,也会触发组件的重新渲染
The text was updated successfully, but these errors were encountered: