路由导航守卫:(全局守卫、路由独享守卫、组件内守卫)
每个守卫方法接收三个参数:
to: Route: 即将要进入的目标 路由对象
from: Route: 当前导航正要离开的路由
next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
全局守卫:触发路由就会触发这些钩子函数
- beforeEach(to,from, next)全局前置守卫:在路由跳转前触发,这个钩子作用主要是用于登录验证,也就是路由还没跳转提前告知,以 免跳转了再通知就为时已晚。
- beforeResolve(to,from, next)全局解析守卫:这个钩子和beforeEach类似,也是路由跳转前触发,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,即在 beforeEach 和 组件内beforeRouteEnter 之后,afterEach之前调用。
- afterEach(to,from)全局后置钩子: 和beforeEach相反,它是在路由跳转完成后触发,它发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫)之前。这些钩子不会接受next函数也不会改变导航本身
路由守卫: 在单个路由配置的时候也可以设置的钩子函数
- beforeEnter(to,from, next)路由独享守卫:和beforeEach完全相同,如果两个都设置了,beforeEnter则在beforeEach之后紧随执行。在路由配置上直接定义beforeEnter守卫
组件守卫:在组件内执行的钩子函数,类似于组件内的生命周期,相当于为配置路由的组件添加的生命周期钩子函数。
- beforeRouteEnter(to,from, next) 该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例,也就是this为undefined。因为它在组件生命周期beforeCreate阶段触发,此时的新组件还没有被创建。在这个钩子函数中,可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。
- beforeRouteUpdadte(to,from, next) 在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例。
- beforeRouteLeave(to,from, next) 导航离开该组件的对应路由时调用,可以访问组件实例this。这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过next( false )来取消。
配置
//全局路由守卫
router.beforeEach((to,from,next)=>{
if(to.path == '/login' || to.path == '/moban'){
next();
}else{
alert('您还没有登录,请先登录');
next('/login');
}
})
完整的导航解析流程
- 触发进入其它路由
- 调用要离开路由的组件守卫beforeRouteLeave
- 调用全局的前置守卫beforeEach
- 在重用的组件里调用 beforeRouteUpdate
- 在路由配置里调用 beforeEnter
- 解析异步路由组件
- 在将要进入的路由组件中调用beforeRouteEnter
- 调用全局的解析守卫beforeResolve
- 导航被确认
- 调用全局的后置钩子afterEach。
- 触发 DOM 更新mounted。
- 执行beforeRouteEnter守卫中传给 next的回调函数。