• vue路由守卫 beforeEach 的使用的填坑记录


    总体来讲vue里面提供了三大类钩子
    1、全局钩子
    2、某个路由的钩子(路由独享)
    3、组件内钩子(组件独享)

    两种函数:

    1、 Vue.beforeEach(function(to,form,next){}) /*在跳转之前执行*/

    2   .Vue.afterEach(function(to,form))/*在跳转之后判断*/

    vue-router beforeEach钩子时,你也许会遇到如下问题

    //路由跳转前做判断
    router.beforeEach((to, from, next) => {
      let hasLogin = Cookies.get('hasLogin'); //从cookies中获取是否已登陆过的信息
      if(hasLogin){
        next()
      }else{
        if(to.path == '/login'){
          next()
        }else{
          next({
            replace:true,
            name:'login',
          })
        }
      }
    
    

    在使用beforeEach中,会遇到两个问题:

    1、访问指定页面出现无法加载的情况(也就是空白)

    2、访问指定页面,出现无限循环的问题

    这么写代码会有个问题,那就是当hasLogin为false时,访问任意页面都会出现空白,这是因为:

    next() 表示路由成功,直接进入to路由,不会再次调用router.beforeEach()
    next('login') 表示路由拦截成功,重定向至login,会再次调用router.beforeEach()
    也就是说beforeEach()必须调用next(),否则就会出现无限循环,next() 和 next('xxx') 是不一样的,区别就是前者不会再次调用router.beforeEach(),后者会!!!


    解决方法

    router.beforeEach((to, from, next)=>{
      if(hasLogin){ //如果已经登录,则直接跳转
        next();
      }else if(to.name === 'Home'){ //如果未跳转,且访问的是首页,则重定向到登录页
        next({
          replace:false,
          name:'login'
        })
      }else{
        next() //新增这一句
      }
    })
     
    /*
    理解:
    当调用完next({name:'login'}),再次调用router.beforeEach()时,此时的to.name可能已经不在router.beforeEach()的条件判断中了,因此需要加上next(),
    告诉路由守卫,这种情况的继续执行,而不至于停留。

    在使用vue-router beforeEach钩子时,你也许会遇到如下问题:

    router.beforeEach((to, from, next) => {
    //判断登录状态简单实例
    var userInfo = window.localStorage.getItem('token');
    if (userInfo) {
    next();
    } else {
    next('/login');
    }
    })

    解决方案

    router.beforeEach((to, from, next) => {
    var userInfo = window.localStorage.getItem('token');//获取浏览器缓存的用户信息
    if(userInfo){ //如果有就直接到首页咯
    next();
    } else {
    if(to.path=='/login'){ //如果是登录页面路径,就直接next()
    next();
    } else { //不然就跳转到登录;
    next('/login');
    }
     
    }
    })

    解决思路:

    排除此时地址 = 转向的地址 的情况,避免dead loop, 问题很简单,但一不小心就入坑了

    以上就是本文的全部内容,希望对大家的学习有所帮助

  • 相关阅读:
    Python开发基础-Day11内置函数补充、匿名函数、递归函数
    Python开发基础-Day10生成器表达式形式、面向过程编程、内置函数部分
    Python开发基础-Day9-生成器、三元表达式、列表生成式、生成器表达式
    Python开发基础-Day8-装饰器扩展和迭代器
    Python开发基础-Day5-字符编码、文件处理和函数基础(草稿)
    Python开发基础-Day7-闭包函数和装饰器基础
    Python开发基础-Day6-函数参数、嵌套、返回值、对象、命名空间和作用域
    Android网络课程笔记-----Actionbar的实现方式
    Android网络课程笔记-----自定义控件的方法和技巧
    浅谈android的selector背景选择器
  • 原文地址:https://www.cnblogs.com/ddqyc/p/15524974.html
Copyright © 2020-2023  润新知