最近在学习vue,感觉路由守卫这个地方知识点挺多的,而且很重要,所以,今天添加一点小笔记官方文档官方文档导航守卫其实也是路由守卫,也可以是路由拦截,我们可以通过路由拦截,来判断用户是否登录,该页面用户是否有权限浏览,需要结合meta来实现
vue中路由守卫一共有三种,一个全局路由守卫,一个是组件内路由守卫,一个是router独享守卫
所谓的路由守卫可以简单的理解为一座房子的门口的保安,想要进入这个房子就必须通过保安的检查,要告诉路由守卫你从哪里来?总不能随便陌生人就给放进去?要到哪里去?然后保安再告诉你下一步该怎么做?如果你的确是这个房子主人允许进入的人,那就让你进入,否则就要打电话给房子主人,跟房主商量(登录注册),给你权限。
// 通过这个匹配判断是否有该权限或要求,这个一般作为页面权限设置,比如哪些页面需要登录才能进入,哪些不需要
to.matched.some(res => res.meta.requireAuth)

// 通过这个匹配判断是否有该权限或要求,这个一般作为页面权限设置,比如哪些页面需要登录才能进入,哪些不需要
to.matched.some(res => res.meta.requireAuth)
一、全局路由守卫
一、全局路由守卫一、全局路由守卫所谓全局路由守卫,就是小区大门,整个小区就这一个大门,你想要进入其中任何一个房子,都需要经过这个大门的检查
全局路由守卫有个两个:一个是全局前置守卫,一个是全局后置守卫
router.beforeEach((to, from, next) => {

console.log(to) => // 到哪个页面去?

console.log(from) => // 从哪个页面来?

next() => // 一个回调函数
}
router.afterEach(to,from) = {}

router.beforeEach((to, from, next) => {

console.log(to) => // 到哪个页面去?

console.log(from) => // 从哪个页面来?

next() => // 一个回调函数
}
router.afterEach(to,from) = {}
next():回调函数参数配置next(false): 中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址
next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace: true、name: 'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项二、组件路由守卫
二、组件路由守卫
二、组件路由守卫

// 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由守卫
beforeRouteEnter (to, from, next) {

// 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通过vm来访问组件实例

next(vm => {})
}
beforeRouteUpdate (to, from, next) {

// 同一页面,刷新不同数据时调用,
}
beforeRouteLeave (to, from, next) {

// 离开当前路由页面时调用
}

// 跟methods: {}等同级别书写,组件路由守卫是写在每个单独的vue文件里面的路由守卫
beforeRouteEnter (to, from, next) {

// 注意,在路由进入之前,组件实例还未渲染,所以无法获取this实例,只能通过vm来访问组件实例

next(vm => {})
}
beforeRouteUpdate (to, from, next) {

// 同一页面,刷新不同数据时调用,
}
beforeRouteLeave (to, from, next) {

// 离开当前路由页面时调用
}
三、路由独享守卫
三、路由独享守卫
三、路由独享守卫路由独享守卫是在路由配置页面单独给路由配置的一个守卫
export default new VueRouter({

routes: [

{

path: '/',

name: 'home',

component: 'Home',

beforeEnter: (to, from, next) => {

// ...

}

}

]
})


export default new VueRouter({

routes: [

{

path: '/',

name: 'home',

component: 'Home',

beforeEnter: (to, from, next) => {

// ...

}

}

]
})

vue-router提供了导航钩子:全局前置导航钩子 beforeEach和全局后置导航钩子 afterEach,他们会在路由即将改变前和改变后进行触发。所以判断用户是否登录需要在beforeEach导航钩子中进行判断。导航钩子有3个参数:导航钩子有3个参数:
1、to:即将要进入的目标路由对象;
2、from:当前导航即将要离开的路由对象;
3、next :调用该方法后,才能进入下一个钩子函数(afterEach)。
next()//直接进to 所指路由

next(false) //中断当前路由

next('route') //跳转指定路由

next('error') //跳转错误路由beforeEach:beforeEach:路由配置文件:

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import HomePage from '@/pages/home.vue'
Vue.use(Router)
const router=new Router({
routes: [

{

path: '/',

name: 'HelloWorld',

component: HelloWorld

},

{

path: '/home',

name: 'home',

component: HomePage

},

{

path:'*',

redirect:'/home'

}
],
})
router.beforeEach((to,from,next)=>{

console.log(to);

console.log(from);

next();
})
export default router;

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import HomePage from '@/pages/home.vue'
Vue.use(Router)
const router=new Router({
routes: [

{

path: '/',

name: 'HelloWorld',

component: HelloWorld

},

{

path: '/home',

name: 'home',

component: HomePage

},

{

path:'*',

redirect:'/home'

}
],
})
router.beforeEach((to,from,next)=>{

console.log(to);

console.log(from);

next();
})
export default router;
打印结果如下: 实现用户验证的代码:
router.beforeEach((to, from, next) => {

//我在这里模仿了一个获取用户信息的方法
let isLogin = window.sessionStorage.getItem('userInfo');

if (isLogin) {

//如果用户信息存在则往下执行。

next()

} else {

//如果用户token不存在则跳转到login页面

if (to.path === '/login') {

next()

} else {

next('/login')

}

}
})
router.beforeEach((to, from, next) => {

//我在这里模仿了一个获取用户信息的方法
let isLogin = window.sessionStorage.getItem('userInfo');

if (isLogin) {

//如果用户信息存在则往下执行。

next()

} else {

//如果用户token不存在则跳转到login页面

if (to.path === '/login') {

next()

} else {

next('/login')

}

}
})afterEach:afterEach:和beforeEach不同的是afterEach不接收第三个参数 next 函数,也不会改变导航本身,一般beforeEach用的最多,afterEach用的少.
router.afterEach((to,from)=>{ //这里不接收next

console.log(to);

console.log(from);
})

router.afterEach((to,from)=>{ //这里不接收next

console.log(to);

console.log(from);
})