共计 1433 个字符,预计需要花费 4 分钟才能阅读完成。
20190218 问
Vue-router 有哪些钩子?使用场景?
router 的实现可以点这里
前面我们用大白话讲过什么是钩子,这里在重复一下,就是在什么什么之前, 什么什么之后, 英文叫 hooks, 专业点叫生命周期,装逼点可以叫守卫 …
vue-router 中也存在钩子的概念, 分为三步记忆
全局守卫
路由独享守卫
组件独享守卫
全局守卫
很好理解,全局守卫就是能监听到全局的 router 动作
router.beforeEach 路由前置时触发
const router = new VueRouter({…})
// to 要进入的目标路由对象
// from 当前的路由对象
// next resolve 这个钩子,next 执行效果由 next 方法的参数决定
// next() 进入管道中的下一个钩子
// next(false) 中断当前导航
// next({path}) 当前导航会中断,跳转到指定 path
// next(error) 中断导航且错误传递给 router.onErr 回调
// 确保前置守卫要调用 next,否然钩子不会进入下一个管道
router.beforeEach((to, from, next) => {
// …
})
router.afterEach 路由后置时触发
// 与前置守卫基本相同,不同是没有 next 参数
router.afterEach((to, from) => {
// …
})
router.beforeResolve
跟 router.beforeEach 类似, 在所有组件内守卫及异步路由组件解析后触发
路由独享守卫
参数及意义同全局守卫,只是定义的位置不同
const router = new VueRouter({
routes: [
{
path: ‘/’,
component: Demo,
beforeEnter: (to, from, next) => {
// …
},
afterEnter: (to, from, next) => {
// …
},
}
]
})
组件独享守卫
组件内新一个守卫, beforeRouteUpdate, 在组件可以被复用的情况下触发,如 /demo/:id, 在 /demo/1 跳转 /demo/ 2 的时候,/demo 可以被复用,这时会触发 beforeRouteUpdate
const Demo = {
template: `…`,
beforeRouteEnter (to, from, next) {
…
},
// 在当前路由改变,但是该组件被复用时调用
beforeRouteUpdate (to, from, next) {
…
},
beforeRouteLeave (to, from, next) {
…
}
}
注意在 beforeRouteEnter 前不能拿到当前组件的 this,因为组件还有被创建,我们可以通过 next(vm => {console.log(vm)}) 回传当前组件的 this 进行一些逻辑操作
使用场景
路由进入前最典型的可以做一些权限控制, 路由离开时清除或存储一些信息, 任务等等
总结
vue-router 中钩子分为全局的,局部的,以及组件三种形式, 他们都有前置守卫以及后置守卫, 其中组件的前置守卫不能拿到当前组件的 this,因组件还没有被创建,可以通过 next 的参数进行回传 this,前置守卫必须调用 next 方法,否则不会进入下一个管道
关于 JS 每日一题
JS 每日一题可以看成是一个语音答题社区 每天利用碎片时间采用 60 秒内的语音形式来完成当天的考题 群主在次日 0 点推送当天的参考答案
注 绝不仅限于完成当天任务,更多是查漏补缺,学习群内其它同学优秀的答题思路
点击加入答题