vue-router 导航守卫

在使用导航守卫的时候由于没有仔细看清官网文档,我是这样写的

router.beforeEach((to, from, next) => {
  NProgress.start()
  if (localStorage.getItem('token')) {
    console.log('token')
    next('/')
  } else {
    console.log('notoken')
    next('/login')
  }
})

router.afterEach(() => {
  NProgress.done()
})

导致的结果


发现其中的beforeEach被无限调用,最后报错失败,而进度条也一直旋转,没有执行到afterEach,查看官网文档


问题就处在 next() 如果带参数,则重新执行beforeEach函数。解决方案:

router.beforeEach((to, from, next) => {
  NProgress.start()
  if (localStorage.getItem('token')) {
    if (to.path === '/login') {
      next('/')
    } else {
      next()
    }
  } else {
    if (to.path === '/login') {
      next()
    } else {
      next('/login')
    }
  }
})

router.afterEach(() => {
  console.log('done')
  NProgress.done()
})

然而点击登陆或跳转其他连接的时候,进度条出问题了。

仔细观察,发现是没有执行到afterEach。最后反复调试,发现跳转页面时beforeEach仅执行了一次,并且到next('/login')或者next('/')之后就停止了,也不会执行afterEach。这样结果的原理不是很懂,但是最终解决方案如下:

router.beforeEach((to, from, next) => {
  NProgress.start()
  if (localStorage.getItem('token')) {
    if (to.path === '/login') {
      next('/')
      NProgress.done()
    } else {
      next()
    }
  } else {
    if (to.path === '/login') {
      next()
    } else {
      next('/login')
      NProgress.done()
    }
  }
})

router.afterEach(() => {
  NProgress.done()
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值