transitionTo 与 confirmTransition 修改的只是 URL 与数据,视图是如何更新的呢?
VueRouter全局注册
1 | export default { |
主要是根据匹配到的路由的不同,render 函数渲染不同的视图。
监听 _route
1 | src/install.js |
修改 _route
在 VueRouter 的 init 方法中提供一个回调函数,并调用 history.listen。 这个回调函数会去修改
_route
1
2
3
4
5history.listen(route => {
this.apps.forEach((app) => {
app._route = route
})
})history.listen 保存回调函数
1
2
3listen (cb: Function) {
this.cb = cb
}confirmTransition 方法执行成功后,调用 this.updateRoute(route) 他会调用之前保存的回调函数改变 _route。_route改变后,RouterView 的 render 方法会重新执行渲染界面。
1
2
3
4
5
6
7
8
9// 更新路由
updateRoute (route: Route) {
const prev = this.current
this.current = route
this.cb && this.cb(route) // <======
this.router.afterHooks.forEach(hook => {
hook && hook(route, prev)
})
}
1 | export default { |
构造 createElement 的 data 参数,包括 on
、attrs
。handel 函数为事件的回调函数:1
2
3
4
5
6
7
8
9
10const handler = e => {
if (guardEvent(e)) {
// 调用 router.replace 或 router.push 跳转路由
if (this.replace) {
router.replace(location)
} else {
router.push(location)
}
}
}
guardEvent 函数会过滤掉无需处理事件,最后根据是否有 replace 属性,调用 router.replace 或 router.push 跳转路由。