vue路由守卫及路由守卫无限循环问题详析
先贴一波官方文档的内容
constrouter=newVueRouter({...}) router.beforeEach((to,from,next)=>{ //... })
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫resolve完之前一直处于 等待中。
每个守卫方法接收三个参数:
- to:Route:即将要进入的目标 路由对象
- from:Route:当前导航正要离开的路由
- next:Function:一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
- next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
- next(false):中断当前的导航。如果浏览器的URL改变了(可能是用户手动或者浏览器后退按钮),那么URL地址会重置到 from 路由对应的地址。
- next('/') 或者 next({path:'/'}):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向 next 传递任意位置对象,且允许设置诸如 replace:true、name:'home' 之类的选项以及任何用在 router-link 的 to prop 或 router.push 中的选项。
- next(error):(2.4.0+)如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。确保要调用 next 方法,否则钩子就不会被resolved
然后这是我自己的总结
importVuefrom'vue' importRouterfrom'vue-router' importLoginfrom'@/pages/login/Login' importIndexfrom'../pages/index/Index' importLibraryfrom'../pages/library/Library' importDesignfrom'../pages/design/Design' importAdministrationfrom'../pages/administration/Administration' importProductionfrom'../pages/production/Production' importGlobalfrom'../common/global/Global' Vue.use(Router) constrouter=newRouter({ routes:[ { path:'/', name:'login', component:Login },{ path:'/index', name:'index', component:Index },{ path:'/library', name:'library', component:Library },{ path:'/design', name:'design', component:Design },{ path:'/administration', name:'administration', component:Administration },{ path:'/production', name:'production', component:Production } ] }) router.beforeEach((to,from,next)=>{ //将所有需要登陆才显示的页面的路由都放进一个数组 constnextRoute=['index','library','design','administration','production']; //获取登陆状态 letisLogin=Global.isLogin if(to.name==='login'){//如果是登录页,则跳过验证 next()//必不可少 return//以下的代码不执行 } if(nextRoute.indexOf(to.name)>=0){//判断该页面是否需要登陆 if(!isLogin){//判断登陆状态 next({name:'login'})//如果未登录,则跳转到登录页 }else{ next()//如果已经登陆,那就可以跳转 } }else{//其他的无需登陆的页面不做验证 next() } }) exportdefaultrouter
这样就实现了全局路由守卫
关于路由守卫无限循环问题
如果你的代码是这样
if(isLogin){ next() }else{ next({name:'login')} }
这样的话就会陷入无限循环
因为你的 next({name:'login')}是相当于一个路由跳转,它会再次触发全局路由守卫,你又进入了全局路由守卫进行再次判断,如此循环。
所以,想要结束路由守卫,整段代码的逻辑必须由next()进行结尾。比如像我上面写的,当需要进入登录页的时候,
if(to.name==='login'){ next() return }
加上这个判断,当你进入登录页的时候也会调用next(),路由守卫进入确认状态,路由才会进行跳转
以上就是我在学习vue-router的路由守卫的总结
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。