看下面这个效果:

每次我们在点击一个功能时,它就会跳转到登录页面,意思就是让我们先登录,登录之后再进行功能操作;但是如果我们登录了,它就不会跳转,这是什么原理呢;
运用的原理:在路由跳转之前,进行拦截检查是否登录,如果没有登录就跳转登录页面,如果登录了就不跳转登录页面。此时就用到了:路由拦截
(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'))//有token信息,就说明已经登录过了
最终的完整代码:
- // 全局拦截
- router.beforeEach((to, from, next) => {
- if (to.meta.isKerwinRequired) {
- // 判断 本地存储中是否token
- if (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')
- }
- }
- }