全局路由拦截、局部路由拦截

引入: 

看下面这个效果: 

每次我们在点击一个功能时,它就会跳转到登录页面,意思就是让我们先登录,登录之后再进行功能操作;但是如果我们登录了,它就不会跳转,这是什么原理呢;

运用的原理:在路由跳转之前,进行拦截检查是否登录,如果没有登录就跳转登录页面,如果登录了就不跳转登录页面。此时就用到了:路由拦截 


如何拦截:

  • 路由拦截分为:全局路由拦截、局部路由拦截;

(1)全局路由拦截:

const router = new VueRouter({
  mode: 'history',
  routes
})

// 全局拦截
router.beforeEach((to, from, next) => {
  if (需要拦截验证的路由) {
    if (验证成功) {
      // next():不拦截,放行
      next()
    } else {
      next('/login')
    }
  } else {
    next()
  }
})
  • 拦截方法:router.beforeEach(回调函数),每个路由跳之前都会执行这个函数;
  • 回调函数有三个参数:to、from、next,
  • to是跳转后路由,from是跳转前路由,next是个函数;
  • next是一个函数,含义是:不需要拦截的路由通行;
  • 并不需要对所有路由进行拦截,不需要拦截的就next()

拦截思路:(对上述代码进行解释)

路由需要拦截就走外围if,不许要拦截就走外围else,通过next()放行;如果拦截的路由授权通过了,就走next()放行,没有授权通过就跳转到某个页面去执行某个功能,去授权。

拿登录案例来理解:

如果点一个功能需要验证是否注册登录,那就拦截下来;不需要验证那就不拦截就走外层else;里层的判断:拦截下来的路由,判断你是否登录,没登录那就else去登录,if登录了那就走next()放行。

案例演示:

现在要求是要拦截 path为 “/center”和“/order”的路由,其他的不拦截;拦截的路由需要判断是否登录;

(1)外层if判断代码:

  • 首先给要拦截的路由加上 meta 
// 配置表,将路径和组件一一对应配置好
const routes = [
  {
    path: '/films',
    component: FilmsView
  },
  {
    path: '/cinemas',
    component: CinemasView
  },
  {
    path: '/center',
    component: CenterView,
    meta: {
      isKerwinRequired: true
    }
  },
  {
    path: '/order',
    component: OrderView,
    meta: {
      isKerwinRequired: true
    }
  }
]
  • meta里面名字随便起,传一个true值,默认不写是false; 

此时打印一下 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()
  }
})
  • “/login” 是登录路由需要配置 

 (2)局部路由拦截:

  • 在需要拦截的路由内部写代码:
{
    path: '/order',
    component: OrderView,
    meta: {
      isKerwinRequired: true
    },
    beforeEnter: (to, from, next) => {
      if (localStorage.getItem('token')) {
        // next():不拦截,放行
        next()
      } else {
        next('/login')
      }
    }
}
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌一一

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值