element表格动态表头错乱 & router.beforeEach() 路由死循环

547 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

1.element动态添加表头的正确姿势,三步完成动态表头

1. 第一步循环 开发表格组件<dsp-table>

具体封装可看前面几期推文

<div :key="status">
        <dsp-table
        //表格数据
        :data="tableData"
        //表头,涉及动态交互
        :header="dailyHeaderselect"
        //封装表格功能项
        :settings="tableSettings"
        //翻页
        @currentPage="currentPage"
        @pageSize="pageSize"
        //复杂表格,嵌套二级表,展开二级表事件
        @sortChange="sortChange"
      >
      </dsp-table>
</div>

2. 第二步  点击按钮动态改变表头

1.方式1:

handleSaveSetTable() {  
  this.$set(this.tableColumn , 2, { name:'手机号', value: 'phone', show: true })  
  this.status= !this.status
  
  // 改变this.status来触发重新做diff运算渲染dom,这样解决了一些固定表头可能出现错乱问题
}

2.方式2:

checkheader(type) {
      let arr=[]
         //展示表头数组
        this.dailyHeaderselect = [];
         //遍历原数组
        for (let index = 0; index < this.dailyHeader.length; index++) {
          const element = this.dailyHeader[index];
          if(index<=1){//固定列
            arr.push(element);
          }else{
            //非固定列,根据页面下拉框选择数据确定展示项
            if (this.checkList1.indexOf(element.label) != -1) {
              arr.push(element);
            }          
          }
        }
        // 改变this.status来触发重新做diff运算渲染dom,这样解决了一些固定表头可能出现错乱问题
          this.status=!this.status
          //新表头
          this.dailyHeaderselect=arr
 }

截屏2021-08-31 下午3.16.51.png

2.router.beforeEach() 动态加载路由出现死循环问题

采用beforeEach做路由过滤,如果没登录就直接跳转到登录界面,然而发现个问题就是要么跳转到登录页面、然后再调回首页,要么卡着不动、要么出现空白页面。

1、router.beforeEach( to , from ,next) 介绍

to: 即将路由的地址

form: 当前的路由地址,也就是马上要离开的地址

next(): 执行进入下一个路由

next(false): 禁止进入下一个路由

next('/login'): 路由到/login地址

2、两种死循环问题

1,路由到相同地址的死循环

比如在beforeEach中设置未登录(userData为null)就跳转到登录页面

  if(localStorage.getItem('status')==null){    
     next()
  }else{
    next({ path: "/login" })
  }

在非登录页面是没有问题的,但是在登录页面就出现了死循环或者空白页,通过打印我们发现浏览器在登录页反复跳转。 截屏2021-08-31 下午3.59.23.png

在登录页面因为没登录,userData为null,这时候通过next(’\login’)就会重定向到登录页面,重定向到登录页面后,这时候userData依然为空,那么就要继续重定向登录页面,于是出现了死循环。 对这种情况加个判断条件就能解决。

 if(localStorage.getItem('status')==null){    
     //有登录态直接跳转next
     next()
  }else{
     //非登录态页面,且不在登录页
    if(to.fullPath!='/login'){
       next({ path: "/login" })
    }else{
      next()
    }     
  }