解决expand-change第一次展开无数据显示与实现tabber表格懒加载

  • 最近写需求时用到了expand-change表格展开回调,但我发现第一次展开后并没有展示任何数据,但我的返回值是存在的,当第二次展开时发现数据就有了。此原因是因为获取数据的接口是异步的,导致Dom渲染不同步导致的,其实解决办法也很简单,只需在外层的表格列表中的每一个数组对象加一个空数组用来存储嵌套的数据列表,这样的话每次渲染,都能获取到这个存在的列表
  • 由于内嵌表格数据过于庞大,需做表格懒加载,所以需要获取到页面元素位置等,还需要持续触发,此时就用到了命令,当满足特定条件就触发页数+1,并触发获取内嵌列表的数据
1 . 解决expand-change第一次展开无数据显示问题
  • 首先:定义好需要展示的数据并设置type="expand"展开子表格,用expand-change来获取当前行展开回调,设置row-key防止数据混乱
<el-table :data="dataList" border row-key="id"  @expand-change="dataListSelectionChangeHandle" style="width: 100%;" >
        <el-table-column type="expand" >
          <template slot-scope="scope">
            <el-table v-loading="dataListLoading"  :row-key="scope.row.child.id" :data="scope.row.child" border style="width: 100%;" >
          <el-table-column prop="categoryRef" label="类目ref" header-align="center" align="center" :show-overflow-tooltip="true"></el-table-column>
          <el-table-column prop="addInfo" label="附加信息" header-align="center" align="center" :show-overflow-tooltip="true"></el-table-column>
          <el-table-column prop="benefitsMealRef" label="权益套餐ID" header-align="center" align="center" :show-overflow-tooltip="true"></el-table-column>
          <el-table-column prop="cardNo" label="会员卡号" header-align="center" align="center" :show-overflow-tooltip="true"></el-table-column>
            </el-table>
          </template>
        </el-table-column>

        <el-table-column prop="merchantName" label="商户" header-align="center" align="center"></el-table-column>
        <el-table-column prop="mealName" label="套餐名称" header-align="center" align="center"></el-table-column>
        <el-table-column prop="createTime" label="创建日期" header-align="center" align="center"></el-table-column>
        <el-table-column prop="updateTime" label="更新日期" header-align="center" align="center"></el-table-column>
      </el-table>
  • 获取回调时向外层表格列表添加一个空数组,并处理Dom渲染不同步问题
  data() {
    return {
      BenefitsMealDetailPageReq: { // 请求列表参数
        pageNum : 1,
        pageSize : 10
      }, 
      timeout: null // 防抖用
      dataList: [], // 外层表格列表数据
      dataRow: [] // 当前行的数据列表(由于子表格是内嵌的,所以也有子表格的所有数据)
  },
  methods:{
    // 展开列回调函数
   dataListSelectionChangeHandle(row,key){
    // 存储当前行的数据
    this.dataRow=row
    // 由于expand-change对于异步加载第一轮dom不渲染先加一个存在的dom让接口返回值可以渲染
    this.dataList.forEach(item => {
      item.child=[]
    })
      // 只有展开列才会触发接口
      if(key.length!==0){
        // 确保第一次展开请求第一页数据
        this.BenefitsMealDetailPageReq.pageNum=1
        this.getTableList(row)
      }
    },
    // 请求权益明细表格
   async getTableList(){
        const res=await this.$http.post('',this.BenefitsMealDetailPageReq)
        if (res.status==200) {
          this.totalCount=res.data.data.pagination
          this.dataRow.child.push(...res.data.data.resultData)
        }
     },
  }
2 . 处理表格懒加载问题
  • 以下只写关键代码,样式与代码位置请参考上面(会写注释标记位置)
<template>
<el-table :data="dataList" border row-key="id"  @expand-change="dataListSelectionChangeHandle" style="width: 100%;" >
        <el-table-column type="expand" >
          <template slot-scope="scope">
            <!-- 此处加入自定义命令 v-loadmore-->
            <el-table v-loading="dataListLoading"  v-loadmore :row-key="scope.row.child.id" :data="scope.row.child" border style="width: 100%;" >
            </el-table>
          </template>
        </el-table-column>
      </el-table>
</template>

<script>
  // 针对tabber懒加载的自定义指令
  directives : {
    loadmore : {
      bind(el, binding,vnode) {
         // 获取页面实例,为了可以调用定义的函数
        let that = vnode.context
        // 获取表格的Dom元素
        const selectWrap = el.querySelector('.el-table__body-wrapper')
        // 页面的滚动事件
        document.addEventListener('scroll', function() {
          let sign = 700
           // 由于获取的是内嵌表格Dom,selectWrap.scrollTop获取不了数值
          // 计算  表格实际高度 - 页面页面卷去的部分
         const scrollDistance = selectWrap.scrollHeight - document.documentElement.scrollTop
         // 判断表格剩余高度是否小于定义的触发值 由于浏览器兼容性差异     需做非负判断
         if (scrollDistance <= sign && scrollDistance>0) {
            // 触发定义的方法
           that.loadMore()
          }
        })
      }
    }
  },
  methods:{
    // tabber懒加载
    loadMore(){
      // 触发时请求下一页  并禁用页面滚动
      document.documentElement.style.overflow='hidden';
      if (this.timeout) {
        clearTimeout(this.timeout)
      }
      // 防止页面滚动过快引发多次触发
      this.timeout=setTimeout(() => {
      this.BenefitsMealDetailPageReq.pageNum++
      // 判断请求到的数据是否超过了总条数
      if(this.dataRow.child.length < this.totalCount.totalCount) {
        this.getTableList()
       }else {
         document.documentElement.style.overflow='';
       }
      }, 200); 
    }
  }
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容