element table 滚动到底 加载剩余内 类似于分页 内容显示在同一页

这篇博客记录了如何在Vue.js应用中实现elementtable组件的滚动加载功能。当表格滚动到底部时,通过监听滚动事件判断是否加载更多数据,更新页码并调用接口获取新数据,将新数据追加到已有数据列表中,直至所有数据加载完毕。此方法优化了页面性能,避免了一次性加载大量数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

element table 滚动到底部加载剩余内容

转自 https://juejin.im/post/6844903765582020621

记录一下根据原博主的理解,写的一些适用于自己项目的修改,整理一下

 data() {
    return {
      total: 0,
      isScrollOver: true, // 下拉数据是否已经加载完成
      pageData: { // 表格数据加载时,带入的参数
        dmId: '', 
        idList: '',
        isReportWorkOrNot: 0,
        pageCode: 1, // 当前页
        pageSize: 20 // 每页几条
      }
  }

主要是这里监听滚动到底了

  mounted() {
  // 监听页面滚动条到最底部了 进行table懒加载   
    _this.$refs.table.bodyWrapper.addEventListener('scroll', (res) => {
      const height = res.target
      const clientHeight = height.clientHeight
      const scrollTop = height.scrollTop
      const scrollHeight = height.scrollHeight
      // total总数据量
      if (clientHeight + scrollTop >= scrollHeight && _this.total > _this.list.length) {
        console.log('到底了')
        _this.pageData.pageCode++
        // 识别是否重复滚动到底
        if (_this.isScrollOver) {
          _this.isScrollOver = false
          _this.pageData.dmId = _this.stId
          getListByDmId(_this.pageData).then(res => {
            if (res) {
              // 在原来数据上加上
              _this.list = _this.list.concat(res.data)
              _this.isScrollOver = true
            }
          }).catch(error => {
            console.log(error)
          })
        }
      }
    }, true)
},
  

获取table值

methods: {
  	getList() {
      const _this = this
      _this.pageData.dmId = _this.stId
      getListByDmId(_this.pageData).then(res => {
        if (res) {
          _this.list = res.data
          this.total = res.total
          _this.loading = false
        }
      }).catch(error => {
        console.log(error)
      })
    },
  }
### 实现Element UI Table滚动加载 为了实现在Element UI `Table` 组件内的数据滚动加载,可以通过监听表格内部容器的滚动事件来判断何时触发新数据加载。具体方法如下: #### 使用自定义指令绑定滚动事件 通过Vue的自定义指令机制,在全局范围内创建一个名为`v-loadmore` 的指令[^3]。 ```javascript // main.js 中注册自定义指令 import Vue from 'vue'; Vue.directive('loadmore', { bind(el, binding) { const selectWrap = el.querySelector('.el-table__body-wrapper'); selectWrap.addEventListener('scroll', function () { // 判断是否接近底部 let sign = 0; const scrollDistance = this.scrollHeight - this.scrollTop - this.clientHeight; if (scrollDistance <= sign && typeof binding.value === "function") { binding.value(); } }); }, }); ``` 此代码片段实现了对`.el-table__body-wrapper` 元素滚动行为的监控,并在其距离底部小于等于设定阈值(`sign`)时调用传入函数以执行进一步操作,比如请求更多数据并更新视图。 #### 数据处理逻辑 对于初始渲染以及后续分批加载数据管理,可以在组件选项中设置监视器(watchers),以便于响应数据变化并控制展示数量[^4]。 ```javascript export default { data() { return { innerData: [], // 当前显示数据集 innerList: [] // 完整数据列表 }; }, watch: { data(newVal) { this.innerData = []; this.innerList = newVal?.records || newVal?.data || []; // 初始化时仅取部分数据显示 for (let i = 0; i < Math.min(100, this.innerList.length); ++i) { this.innerData.push(this.innerList[i]); } } }, }; ``` 上述配置确保了初次加载时不会一次性呈现过多记录,而是按照一定比例逐步增加可见项的数量,从而优化用户体验和性能表现。 #### 动态追加数据 每当检测到用户即将到达面末端时,应该向现有数据集中添加新的条目而不是替换它们。这通常涉及到调整原有数组结构或将额外项目附加至末尾。 ```javascript methods: { loadMoreItems() { const startIdx = this.innerData.length; const endIdx = Math.min(startIdx + 50, this.innerList.length); for (let idx = startIdx; idx < endIdx; ++idx) { this.innerData.push(this.innerList[idx]); } // 如果已经没有剩余加载数据,则移除监听或提示已完成加载 if (endIdx >= this.innerList.length) { console.log("No more items to load."); } } } ``` 这段JavaScript 方法展示了如何安全地扩展当前显示内容集合而不破坏原有的DOM 结构稳定性;同时也考虑到了边界情况下的适当反馈给前端使用者。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值