看下面这个效果:

每次我们在点击一个功能时,它就会跳转到登录页面,意思就是让我们先登录,登录之后再进行功能操作;但是如果我们登录了,它就不会跳转,这是什么原理呢;
运用的原理:在路由跳转之前,进行拦截检查是否登录,此时就用到了:路由拦截
(1)全局路由拦截:
const router = new VueRouter({mode: 'history',routes
})// 全局拦截
router.beforeEach((to, from, next) => {if (需要拦截验证的路由) {if (验证成功) {// next():不拦截,放行next()} else {next('/login')}} else {next()}
})
拦截思路:(对上述代码进行解释)
路由需要拦截就走外围if,不许要拦截就走外围else,通过next()放行;如果拦截的路由授权通过了,就走next()放行,没有授权通过就跳转到某个页面去执行某个功能,去授权。
拿登录案例来理解:
如果点一个功能需要验证是否注册登录,那就拦截下来;不需要验证那就不拦截就走外层else;里层的判断:拦截下来的路由,判断你是否登录,没登录那就else去登录,if登录了那就走next()放行。
案例演示:
现在要求是要拦截 path为 “/center”和“/order”的路由,其他的不拦截;拦截的路由需要判断是否登录;
(1)外层if判断代码:
// 配置表,将路径和组件一一对应配置好
const routes = [{path: '/films',component: FilmsView},{path: '/cinemas',component: CinemasView},{path: '/center',component: CenterView,meta: {isKerwinRequired: true}},{path: '/order',component: OrderView,meta: {isKerwinRequired: true}}
]
此时打印一下 to 的值:
console.log(to)
没加meta之前的结果:

加了meta之后的结果:

此时需要拦截的路由的meta都是true,那外层的if语句条件不就有了:(这就话的思路就是给需要拦截的加“特殊标记”呗。)
if (to.meta.isKerwinRequired){}
(2)里层if代码:
现在是拦截好路由了,接下来判断是否登录;
if (localStorage.getItem('token'))
最终的完整代码:
// 全局拦截
router.beforeEach((to, from, next) => {if (to.meta.isKerwinRequired) {// 判断 本地存储中是否tokenif (localStorage.getItem('token')) {// next():不拦截,放行next()} else {next('/login')}} else {next()}
})
(2)局部路由拦截:
{path: '/order',component: OrderView,meta: {isKerwinRequired: true},beforeEnter: (to, from, next) => {if (localStorage.getItem('token')) {// next():不拦截,放行next()} else {next('/login')}}
}