当前位置:   article > 正文

记录实现el-table列表的无限滚动(InfiniteScroll)--使用原生Scroll_el-table-infinite-scroll

el-table-infinite-scroll

        由于接收到要求,项目由vue2切换成vue3,要前台列表使用无限滚动展示数据,我在查阅资料后发现原来官方推荐的方法是vue-infinite-scroll这个现在已经不在维护的插件,虽然vue-infinite-scroll确实挺好的,但就是不支持vue3,所以我使用的是原生的scroll标签实现的。相当于滚动加载下一页的数据。

 上代码:

import { ref } from 'vue'

我自己做了一个简单的列表

  1. <!-- 数据表格 -->
  2. <el-table ref="businessTable" :data="sourceBusiness.list" style="width: 100%; max-height: 400px; overflow-y: auto" @scroll.enter="handleScroll">
  3. <el-table-column prop="businessCode" label="业务属性代码" />
  4. <el-table-column prop="businessName" label="分类名称" />
  5. <el-table-column prop="describes" label="描述" />
  6. <el-table-column label="操作">
  7. <template #default="{ row }">
  8. <el-button type="primary" @click="editBusiness(row)">编辑</el-button>
  9. <el-button type="danger" @click="deleteBusiness(row)">删除</el-button>
  10. </template>
  11. </el-table-column>
  12. </el-table>
  1. data() {
  2. return {
  3. loading: false,
  4. scrollTimer: null,
  5. showLoadMoreButton: true, //是否显示加载更多数据
  6. scrollPosition: 0, //记录滚动条位置
  7. businessRequest: {
  8. businessCode: '',
  9. businessName: '',
  10. pageNum: 1,
  11. pageSize: 10
  12. },
  13. sourceBusiness: {
  14. list: [],
  15. total: 0
  16. },
  17. // 其他数据信息...
  18. }
  19. created() {
  20. this.loadData()
  21. },

methods:

  1. //滚动事件
  2. handleScroll() {
  3. //这是使用setTimeOut函数来延迟执行,以便在滚动表格的时候节省资源和优化性能
  4. //设置一个定时器scrollTimer,判断如果之前设置过定时器会清除之前的定时器,以免多次触发滚动事件
  5. if (this.scrollTimer) {
  6. clearTimeout(this.scrollTimer);
  7. }
  8. //设置定时器scrollTimer延迟200毫秒后执行回调函数
  9. this.scrollTimer = setTimeout(() => {
  10. const tableEl = this.$refs.businessTable.$el //表格的DOM元素
  11. const scrollContainerHeight = tableEl.clientHeight //获取表格容器的高度,即当前可见区域的高度
  12. const scrollContentHeight = tableEl.scrollHeight //获取表格内容的高度,即所有行的高度
  13. const scrollTop = tableEl.scrollTop //获取表格容器滚动的距离,即当前可见区域顶部距离表格顶部的距离
  14. //判断是否到达底部并且当前没有正在加载更多数据,如果是,则执行方法loadMoreData()
  15. if (scrollTop + scrollContentHeight >= scrollContainerHeight && !this.loading) {
  16. this.loadMoreData()
  17. }
  18. //将当前滚动位置保存到组件实例的scrollPosition中,以便下次执行定时器能够正确判断滚动事件
  19. this.scrollPosition = scrollTop
  20. },200)
  21. },
  1. //这个方法用于从后端加载数据并将其添加到当前显示数据的末尾
  2. loadData() {
  3. //表示正在加载数据
  4. this.loading = true
  5. //根据currentPage 和 pageSize 从后端加载数据
  6. //发起请求,更新businessData
  7. useBusinessApi(this.businessRequest).then(res => {
  8. //将获取到的数据添加到当前已经显示的数据末尾,这里使用concat函数将两个数据合并
  9. this.sourceBusiness.list = this.sourceBusiness.list.concat(res.data.list)
  10. console.log(this.sourceBusiness.total)
  11. //表示数据加载完成
  12. this.loading = false
  13. //使用$nextTick函数延迟执行一段回调函数
  14. this.$nextTick(() => {
  15. //回复滚动位置
  16. const tableEl = this.$refs.businessTable.$el
  17. //将表格的滚动位置设置为新的scrollPosition属性,以保持在加载数据时的滚动位置保持不变
  18. tableEl.scrollTop = this.scrollPosition
  19. })
  20. })
  21. .catch(error => {
  22. //发生错误,控制台打印错误信息,并将 loading 属性设置为 false,表示数据加载完成
  23. console.error(error)
  24. this.loading = false
  25. })
  26. },
  1. //滚动到底部时加载更多数据
  2. loadMoreData() {
  3. //将请求类的页码的pageNum加一,以获取下一页的数据
  4. this.businessRequest.pageNum++
  5. //加载数据到后端,以实现无限滚动效果
  6. this.loadData()
  7. },

后端是使用MyBatisPlus实现的普通的分页列表:

  1. @PostMapping("/page")
  2. @Operation(summary = "分页")
  3. public Result<PageResult<SourceBusiness>> page(@RequestBody BusinessRequest businessRequest){
  4. PageResult<SourceBusiness> result = businessService.page(businessRequest);
  5. return Result.ok(result);
  6. }

展示效果:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/193939
推荐阅读