vue2+el-table通过指令实现懒加载

第一步:给元素添加指令:

 <el-table :data="tableData"
            ref="table"
            border
            stripe
            height="100%"
            tooltip-effect="dark"
            style="width:100%"
            // 这里注意:指令方法不加括号
            v-el-table-tableLazy="tableLazy">
 // 表格内容
 </el-table>

第二步:自定义指令,这段指令代码可以照抄

directives: {
    'el-table-tableLazy': {
      bind (el, binding) {
        let SELECT_DOM = el.querySelector(
          '.el-table__body-wrapper'
        )
        SELECT_DOM.addEventListener('scroll', function () {
          let condition =
            this.scrollHeight - this.scrollTop <= this.clientHeight + 50
          if (condition) {
            binding.value()
          }
        })
      },
    },
  },

第三步:指令调用的方法,即滚动时触发的方法

需要提前定义的变量有:tableData, page, pageSize, isLoading, total

tableLazy () {
      if (this.total == this.tableData.length) {
        // 已经滚动到最后
      } else {
        this.getTableData()
      }
    },
    getTableData () {
      let _this = this
      if (_this.isLoading) return
      _this.isLoading = true
      // 组装请求的filterModel
      return new Promise(function (resolve, reject) {
        _this.请求名称(filterModel)
          .then(res => {
            if (!!res) {
              if (res.ObjectList && res.ObjectList.length) {
                _this.tableData = _this.tableData.concat(res.ObjectList)
                _this.page++
                _this.total = res.TotalCount
                _this.isLoading = false
              }
            } 

            resolve()
          })
          .catch(err => {
            reject(err)
          })
      })
    },

参考自:给el-table或给el-select添加懒加载 - 好大的虫子 - 博客园

### Vue2实现 el-table 组件的滚动懒加载 为了在 Vue2 的 `el-table` 组件中实现滚动懒加载功能,可以通过自定义指令来监听表格容器的滚动事件并动态加载更多数据。以下是完整的实现方式: #### 自定义指令代码 创建一个名为 `tableLazy` 的自定义指令,用于绑定到 `el-table` 容器上。 ```javascript // 在 main.js 或单独的文件中注册全局指令 Vue.directive('tableLazy', { bind(el, binding) { const bodyWrapper = el.querySelector('.el-table__body-wrapper'); // 获取表格主体部分 if (!bodyWrapper) return; bodyWrapper.addEventListener('scroll', function () { const condition = this.scrollHeight - this.scrollTop <= this.clientHeight + 50; // 判断是否接近底部 if (condition && typeof binding.value === 'function') { binding.value(); // 调用传入的方法以加载新数据 } }); }, }); ``` 上述代码实现了当用户滚动至表格接近底部时触发回调函数的功能[^1]。 #### 使用示例 在模板中应用该指令,并传递一个方法作为参数,此方法负责请求新的数据片段并更新表格的数据源。 ```html <template> <div> <el-table v-tableLazy="loadMoreData" :data="tableData"> <!-- 表格列配置 --> <el-table-column prop="id" label="ID"></el-table-column> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [], // 初始化为空数组 currentPage: 1, pageSize: 20, }; }, methods: { loadMoreData() { setTimeout(() => { this.currentPage += 1; this.fetchData(); }, 500); // 模拟延迟效果 }, fetchData() { // 假设这是异步获取数据的方式 fetch(`https://api.example.com/data?page=${this.currentPage}&size=${this.pageSize}`) .then((response) => response.json()) .then((newItems) => { this.tableData.push(...newItems); }) .catch((error) => console.error(error)); }, }, created() { this.fetchData(); // 页面初始化时加载第一页数据 }, }; </script> ``` 以上代码展示了如何将自定义指令绑定到 `el-table` 上,并通过调用 `loadMoreData` 方法逐步加载更多的数据项。 #### 关键点说明 - **性能优化**:由于大量数据可能导致前端渲染缓慢甚至卡死浏览器窗口,因此采用懒加载技术能够显著提升用户体验和系统稳定性[^2]。 - **防抖处理**:实际项目开发过程中建议加入防抖机制(debounce),防止频繁触底引发多次不必要的网络请求操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值