解决expand-change第一次展开无数据显示与实现tabb

2021-12-07  本文已影响0人  许___
1 . 解决expand-change第一次展开无数据显示问题
<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>
  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>
上一篇 下一篇

猜你喜欢

热点阅读