1.导航守卫是什么?
导航守卫就是路由跳转的过程中的一些钩子函数。(路由跳转是一个大的过程,这个大的过程分为跳转前,跳转中,跳转后等过程,在每一个过程中都有一个函数,这个函数可以让你操作一些其他的事情)
比如说点击一个页面,如果未登录就跳转到登录页面,已登录就让用户正常进入使用。
2.全局路由守卫分类
router.beforeEach(全局前置守卫)
router.boforeEach((to,from,next)=>{
//to:将要进入的目标路由对象
//from:即将离开的目标路由对象
//next:执行跳转的下一步钩子
console.log(to)
console.log(from)
if(to.name !=='login'){//如果不是登录页面
if(ISLOGIN){next()} //如果已经登录就跳转
else next({name:'login'}) //否则跳转到登录页面
}else{
if(ISLOGIN) next({name:'/'}) //已经登录就跳转到首页
else next() //否则跳转到登录页面
}
})
每次路由跳转,router.boforeEach都会执行,并且接收三个参数to,from,next.
router.beforeEach就是全局路由跳转时触发执行的函数。
router.boforeResolve(全局解析守卫)
和全局前置守卫类似,区别在于:
跳转被确认之前,同时在所有组件内守卫和异步路由组件都被解析之后,解析守卫才调用。
router.afterEach(全局后置守卫)
只接受to和from,不会接收next函数,也不会改变导航本身。
3.路由独享守卫
beforeEnter
beforeEnter接收的参数与全局守卫是一致的,但是该守卫只在其他路由跳转至配置有beforeEnter路由表信息时才生效。
router配置文件内容:
path:'/login',
name:login,
component:login,
beforeEnter:((to,from,next)=>{
console.log(to);
console.log(from);
next()
})
4.组件内守卫
参数都为to,from,next
beforeRouterEnter
进入该路由时执行
beforeRouterUpdate
该路由中参数发生改变时执行
beforeRouterLeave
离开该路由时执行
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
}
导航解析流程
1.导航被触发
2.在失活的组件里调用beforeRouterLeave守卫
3.调用全局的beforeEach守卫
4.在重用的组件内调用beforeRouerUpdate守卫
5.在路由配置里调用beforeEnter
6.解析异步路由组件
7.在激活的组件内调用beforeRouterEnter
8.调用全局的beforeResolve守卫
9.导航被确认
10.调用全局的afterEach钩子
11.触发DOM更新
12.调用beforeRouterEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。