任何一个钩子函数都可以终止界面切换;——-界面切换:组件更换;数据更新;
每个切换钩子函数都会接受一个 transition 对象作为参数
切换对象(transition):
**对象属性**:
//表示要切换的路径(目标路径)的路由对象;
transition.to
//表示当前路径的路由对象;
transition.from
**对象方法**:
//调用此函数处理切换过程的下一步;(是因为任何一个钩子函数都可以终止界面切换么??)
transition.next()
//调用此函数来终止或者拒绝此次切换
transition.abort([reason])
//取消当前切换并重定向到另一个路由
transition.redirect(path)
全局的前置钩子函数:
router.beforeEach(function(transition){
})
//在路由切换开始时调用;
//调用发生在整个切换流水线之前;
//如果此钩子函数拒绝了切换,整个切换流水线根本就不会启动;
//可以注册多个全局的前置钩子函数,同步顺序被调用;
全局的后置钩子函数:
router.afterEach(function(transition){
//只能访问transition.on和transition.from属性
})
//在每次路由验证成功进入激活阶段时被调用;
//调用时仅仅意味着切换已经被验证过了(canDeactivate和canActivate都成功的被断定resolved),而且浏览器地址栏的地址已经更新;
//不能保证所有的active钩子函数都被断定了;
//可以注册多个全局的后置钩子函数,同步顺序被调用;
//切换流水线:
1.检查当前的视图结构中是否存在可重用的组件:
通过对比两个新的组件树,找出共用的组件,然后检查它们的可重用性;
组件A.canReuse?
2.验证阶段:
检查当前的组件是否能够被停用以及新组件是否可以被激活:
组件B.canDeactivate? -------按照从下至上的冒泡顺序检查,先判断子组件是否可以被停用;
组件C.canActivate? ---------按照从上至下的传播顺序检查,先判断父组件是否可以被激活;
如果在验证阶段终止了界面切换,路由器会保持当前的应用状态,恢复到前一个路径;
3.激活阶段:
上一阶段验证成功完成(都被调用且没有被终止),路由器则开始禁用当前组件并启用新组件;
禁用当前组件的顺序从下至上;
启用新组件的顺序从上至下;
组件B.deactivate
组件C.activate --> C.data
界面的更新(数据的更新)会等到所有受影响的组件deactivate 和 activate钩子函数执行之后才进行;
4.钩子函数的使用:
在构建组件的 route 选项中实现这些函数:
Vue.component('hook-example', {
// ... other options
route: {
activate: function (transition) {
//接受transition对象作为参数;
transition.to;
transition.from;
transition.next();
transition.abort([reason]);
transition.redirect(path);
},
deactivate: function (transition) {
console.log('hook-example deactivated!')
transition.next()
}
}
})