导航守卫分类
导航守卫按照维度分三个:
全局的:进入任何一个路由都会执行
- beforeEach:进入路由前执行
- beforeResolve:在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用
- afterEach:导航确认执行时执行,可理解为导航完成时执行
路由的:进入某个路由才会执行
- beforeEnter: 进入该路由前
组件的:进入某个组件才会执行组件复用时
- beforeRouteEnter: 进入组件时
- beforeRouteUpdate: 组件被复用时调用
- beforeRouteLeave: 离开组件前
举例
//组件内守卫
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`
}
}
完整的导航解析流程
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave守卫。 - 调用全局的
beforeEach守卫。 - 在重用的组件里调用
beforeRouteUpdate守卫 。 - 在路由配置里调用
beforeEnter。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter。 - 调用全局的
beforeResolve守卫 。 - 导航被确认。
- 调用全局的
afterEach钩子。 - 触发 DOM 更新。
- 调用
beforeRouteEnter守卫中传给next的回调函数,创建好的组件实例会作为回调函数的参数传入。
利用守卫模式,限制页面访问权限
方法一:vue-router导航守卫的beforeEach方法做权限限制
//main.js
router.beforeEach((to, from, next) => {
// 使用钩子函数对路由进行权限跳转
const role = localStorage.getItem('username');
if ( !role && to.path !== '/login' && to.path !== '/register' ) {
// 如果用户不存在,并且访问的页面不是登录和注册,就前往登录页面
next('/login');
} else if ( to.meta.permission ) {
// 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
role === 'admin' ? next() : next('/403');
}
})
方法二:vue-router的重定向
//router index.js
export default new Router({
routeindex.jss: [{
path: '/',
redirect: '/home' // 任何没有具体路径的访问,我都让它重定向到home主页,重定向在限制用户手动修改URL时误操作很管用
},
{
path: '*',
redirect: '/404'
}]