路由守卫整理分类与具体使用方法
一、 什么是路由守卫?
在页面跳转时,提供拦截处理的功能。通常用于权限校验和登录判断等。
1. 根据作用范围的大小,分为全局守卫、路由独享的守卫和组件内的守卫
2. 根据作用顺序的前后,分为前置守卫、解析守卫、后置守卫等
3. 全局守卫:每次页面跳转都会触发,无论哪个页面都会触发.代码写在`路由的index.js`或者`main.js`中。
二、 路由守卫三个参数
1、to:即将要进入的目标路由对象
2、from:当前导航正要离开的路由
3、next:一定要调用该方法!不然页面一片白茫茫,这是中间件
三、 路由守卫有哪些?
- 全局前置守卫(写在main.js或者router/index.js中)
router.beforeEach
router.beforeEach((to, from, next)=> {
// to:下一个页面的路由对象,即将进入的那个页面
// from:当前页面的路由对象,正在离开的这个页面
document.title = to.meta.title;
next();
})
- 全局解析守卫(和router.beforeEach类似,在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用)
router.beforeResolve
router.beforeResolve((to, from, next) => {
console.log('===============');
console.log(to);
console.log(from);
console.log('===============');
next();
})
- 全局后置钩子(跳转后触发,没有next)
router.afterEach
router.afterEach((to, from) => {
console.log('===============');
console.log(to);
console.log(from);
console.log('===============');
})
- 单个路由独享前置守卫(路由独享前置守卫,参数的用法和全局前置守卫一样,只有这个路由切换时会触发,别的不管,放在在router/index.js的某一个路由中)
beforeEnter
{
path: '/xxx',
name: 'xxx',
component: xxx,
beforeEnter: ((to, from, next) => {
console.log('路由独享前置守卫===============');
console.log(to);
console.log(from);
console.log('路由独享前置守卫===============');
next();
})
}
- 组件内守卫当要进入的url中包含这个组件时才会触发,别的不管的守卫
beforeRouteEnter
// 在某一个组件中,当成生命周期来写就行
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
四、 完整的导航解析流程
导航被触发。
在失活的组件里调用 beforeRouteLeave 守卫。
调用全局的 beforeEach 守卫。
在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
在路由配置里调用 beforeEnter。
解析异步路由组件。
在被激活的组件里调用 beforeRouteEnter。
调用全局的 beforeResolve 守卫 (2.5+)。
导航被确认。
调用全局的 afterEach 钩子。
触发 DOM 更新。
调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。