el-table滚动加载、懒加载(自定义指令)

我们在实际工作中会遇到这样的问题:

应客户要求,某一个列表不允许分页。但是不分页的话,如果遇到大量的数据加载,不但后端响应速度变慢,前端的渲染效率也会降低,页面出现明显的卡顿。

那如何解决这个问题呢

我们可以用模拟分页,当滚动条滚动到底部时再次加载剩余的部分数据,触底加载,直到加载完成。

先看一个线上的演示示例:

https://code.juejin.cn/pen/7273420104565456953

开发思想参考:

https://blog.csdn.net/weixin_43340372/article/details/132601018?spm=1001.2014.3001.5501

代码

html 复制代码
<div id="app">
  <el-table
      :data="tableData"
      height="300"
      row-key="id"
      border
      size="mini"
      v-el-table-lazyloading="lazyloading"
    >
      <el-table-column prop="date" label="日期" width="180"> </el-table-column>
      <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
      <el-table-column prop="address" label="地址"> </el-table-column>
    </el-table>
</div>

<script>
// 伪造接口调用
class Api {
  #baseData = [{
    date: '2016-05-03',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-02',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-04',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-01',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-08',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-06',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-07',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-07',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-07',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }, {
    date: '2016-05-07',
    name: '王小虎',
    address: '上海市普陀区金沙江路 1518 弄'
  }]
  getData(currentPage = 1, pageNumber = 10) {
    return new Promise(resolve => {
      setTimeout(() => {
        let data = [];
        if (currentPage > 1) {
          data = this.#baseData.map(item => ({...item, name: item.name + `currentPage-${currentPage}`, address: item.address + `currentPage-${currentPage}` }))
        } else {
          data = this.#baseData;
        }
        resolve(data);
      }, 1000
      )
    })
  }
}
const api = new Api();
// 全局注册组件
new Vue({
  el: '#app',
  directives: {
    "el-table-lazyloading": {
      bind(el, binding) {
        let SELECT_DOM = el.querySelector(".el-table__body-wrapper");
        console.log("SELECT_DOM",SELECT_DOM)
        SELECT_DOM.addEventListener("scroll", function () {
          let condition =
            this.scrollHeight - this.scrollTop <= this.clientHeight;
          if (condition) {
            binding.value();
          }
        });
      },
    },
  },
  data() {
    return {
      currentPage: 1,
      pageNumber: 10,
      value: "",
      tableData: [],
    };
  },
  methods: {
    async lazyloading() {
      this.loading = true;
      const data = await api.getData(this.currentPage);
      this.loading = false;
      this.tableData.push(...data);
      this.currentPage++;
    }
  },
  mounted() {
    this.lazyloading();
  }
})

<style>
#app{
  padding: 10px;
}
</style>
</script>
相关推荐
子兮曰3 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A4 小时前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋4 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄5 小时前
JavaScript 隐式全局变量解析
javascript
honkun66 小时前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19916 小时前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net