vue跳到页面_Vue踩坑记 — beforeEach 中 next 方法

b5b272c4ed9476d6242c07903f361964.png

bug收集:专门解决与收集bug的网站

网址:www.bugshouji.com

01 全局前置守卫介绍

使用 router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {  // ...})
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。 每个守卫方法接收三个参数:
  • to: Route: 即将要进入的目标 路由对象
  • from: Route: 当前导航正要离开的路由
  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数
02 next方法解析

next()不会触发 beforeEach 

next('/xxx') 或者 next({ path: '/xxx' }) 跳到不同的地址都会再次执行 router.beforeEach 钩子函数。 

03 next引发的错误

一、vue 全局前置守卫引起死循环

router.beforeEach((to,from,next) =>{  if (sessionStorage.getItem("token")) {     if(to.path === "/login"){       next({path:"/dashboard"})     }     else{       alert("1")       next()     }       }else{    next({path: "/login"})   // 会再次执行前置导航守卫,因为路径变化  }})

解决方案:

router.beforeEach((to, from, next) => {  let token = window.sessionStorage.getItem('token');  if (to.path != '/login' && !token) {    next({      path: '/login'    })  } else {    if (to.path == '/login' && token) {      next('/dashboard')    } else {           next()    }  }})
二、vue-router 动态加载路由,可以实现,但是刷新页面就不显示了
if (to.name === 'Login') {    next();  } else {    if (to.meta.requireAuth) { // 验证用户是否登录      if (sessionStorage.getItem('isLogin')) {        if(store.getters.getIsLogin && store.getters.getRefresh){          // 如果用户登录了,页面refresh值为true,则重新添加路由          store.dispatch('setNoRefresh'); //重新刷新设置为false          DynamicAddRouter();//添加动态路由的方法          next()        }else{          next();        }      } else {        next({          path: '/login'        })      }    } else {      if(store.getters.getRefresh){        console.log("加载动态路由")        // 如果用户登录了,页面refresh值为true,则重新添加路由        store.dispatch('setNoRefresh'); //重新刷新设置为false        DynamicAddRouter();//添加动态路由的方法        next()      }else{        next();      }    }
解决方案: 动态加载路由后,将next()方法,改为next({ ...to, replace: true }) 注:只将动态路由加载后的next方法,进行改变,如果全部改变,将进入到死循环
if (to.name === 'Login') {  next();} else {  if (to.meta.requireAuth) { // 验证用户是否登录    if (sessionStorage.getItem('isLogin')) {      if(store.getters.getIsLogin && store.getters.getRefresh){        // 如果用户登录了,页面refresh值为true,则重新添加路由        store.dispatch('setNoRefresh'); //重新刷新设置为false        DynamicAddRouter();//添加动态路由的方法        next({ ...to, replace: true })      }else{        next();      }    } else {      console.log(sessionStorage.getItem('isLogin'))      next({        path: '/login'      })    }  } else {    if(store.getters.getRefresh){      console.log("加载动态路由")      // 如果用户登录了,页面refresh值为true,则重新添加路由      store.dispatch('setNoRefresh'); //重新刷新设置为false      DynamicAddRouter();//添加动态路由的方法      next({ ...to, replace: true })    }else{      next();    }  }

解析:replace属性为true的时候可以让链接在跳转的时候不会留下历史记录。

喜欢这篇文章,可以支持一下哟,分享、点赞、在看走一个,哈哈@_@

更多文章,请关注公众号【bug收集】 6daec1cce33f671de0211a5611c9ff33.png
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值