el-table懒加载滚动分页

1,446 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

el-table懒加载滚动分页

element-uielement-plus有使用区别:主要是滚动条所在的dom有不同,而我们必须要监听这个dom才能进行下面的操作。 element-ui版本

let dom = document.querySelector(".el-table__body-wrapper");// 

element-plus版本

let dom = document.getElementsByClassName("el-scrollbar__wrap")[1];// 

element-plus所监控的dom有区别是因为,element-plus内部封装加入了el-scrollbar组件,所以定位dom的时候需要注意当前页面它的实际位置, 如果当前使用了不止一个就要定位确定一个不会改变的位置。

lazyLoading() {
  console.log('执行滚动监听');
  let dom = document.getElementsByClassName("el-scrollbar__wrap")[1];
  dom.addEventListener("scroll", this.lazyLoad);// 
},

lazyLoading()是用于监听下面的方法

lazyLoad(){
  let dom = document.getElementsByClassName("el-scrollbar__wrap")[1];// element-plus
  // 计算滚动后距离底部的长度
  const scrollDistance = dom.scrollHeight - dom.scrollTop - dom.clientHeight;
  if (scrollDistance <= 1 && this.isLazyLoading) {
    // 计算总页数 方便下面计算
    let totalPage = this.autoDataCount / this.para.PageInfo.pageSize;
    // 页数使用 Math.ceil() 方法向上取整
    totalPage = Math.ceil(totalPage);
    // 当页数大于等于总页数时,便是达到了最后一页
    if (this.para.PageInfo.pageNum >= totalPage) {
      //判断是否到达底部
      console.log("已经到达底部")
    } else {
      this.para.PageInfo.pageNum++;// 此时页数加1
      this.isLazyLoading = false;// 此变量可配合进行防抖 如果没有可能导致滚动到底部时多次请求下一页、下下一页
      this.isLoading = true;// 表格加载的loading效果
      // setTimeout(() => {
      this.getAutoData(true);// 调用查询数据接口
      // }, 500);
      console.log("页面已经到达底部,请求第 " + this.para.PageInfo.pageNum + " 页数据");
    }
  }
}

接口获取的数据 这里写ajax请求数据,然后使用push方法或者是下面的写法,把获取到的数据放入tableData,这里必须用push,之前不用滚动懒加载倒是一般使用直接赋值的写法。
这里还需要判断滚动状态:非滚动状态下直接赋值;滚动状态下才可以使用push方法;

async getAutoData(isScroll){
  let me = this;
  arr = await this.ajax.get('http://xxxx')//
  if(isScroll){
    me.tableData = [...me.tableData, ...arr];
    me.isLazyLoading = true;
  }else{
    me.tableData = arr
    me.$nextTick(()=>{
      me.lazyLoading();
    })
  }
  me.isLoading = false
}

移除监听 清空内容(当使用搜索、重置等改变数据内容时,调用这个方法,可以消除滚轮位置异常bug)
采用的方法就是先移除监听,移除监听之后滚动条也可以恢复正常位置。


reloadLazyLoading(){
  this.isLoading = true;
  this.para= {
    queryId: "",
    PageInfo: { pageNum: 1, pageSize: 10 },
    conditions: null,
  },
  let dom = document.getElementsByClassName("el-scrollbar__wrap")[1];
  dom.removeEventListener("scroll", this.lazyLoad);
  this.tableData = [];
  this.getAutoData();
},