当前位置: 首页 > news >正文

大数据量实现滚动分页-vue3+element-plus实现方式

1.背景:分页是处理大数据量的一种常见方式,一般有页码分页、滚动分页的实现方式,表格页面分页非常常见,下面是一个列表或者表格的滚动分页。
2.话不多说,上代码:
(1)解题思路:首先,我采用了 element plus 上的v-infinite-scroll 属性(无限滚动),在滚动时请求分页接口来获取数据;其次,每次请求后的数据都要拼接起来,最后,处理每次滚动都只请求一次接口,使用了nextTick(提高性能,减少不必要的计算和渲染,确保DOM更新完成后执行)

页面代码

<divref="scrollContainer"class="container"id="Content"v-infinite-scroll="handleScroll"><el-row><el-colv-for="(item, index) in allChartList"class="pb-10 pr-4":key="index"><div class="chart-card"><span>{{ item.tagName }}</span><span>{{ item.tagValue }}{{ item.unitName }}</span>...</div></el-col><p v-if="loading">Loading...</p></el-row><script setup lang="ts">
import { ref, computed, nextTick } from "vue";
const allChartList = ref<any>([]);
const loading = ref<boolean>(false);
const pageSize = ref<number>(16);
const pageNo = ref<number>(1);
const totals = ref<number>(0);
const totalPage = computed(() => Math.ceil(totals.value / pageSize.value)); // 计算出你的页码 防止无限滚动
const getData = async () => {try {const result:any = await 自己的API({pageSize: pageSize.value,pageNo: pageNo.value,});if (result.code === "0") {if (result.data) {totals.value = result.data.total;const newData = result.data.list || []allChartList.value = [...allChartList.value, ...newData];}} else {ElMessage.error(result.msg || "查询失败");}} catch (error) {loading.value = false;}
};
// 处理滚动事件
const handleScroll = () => {const scrollTop =document.documentElement.scrollTop || document.body.scrollTop;const clientHeight = document.documentElement.clientHeight;const scrollHeight = document.documentElement.scrollHeight;if (scrollTop + clientHeight >= scrollHeight -10 &&pageNo.value < totalPage.value) { // 这里 需要把当前页面与我们数据的最大页码做比较 避免无限滚动loading.value = true;nextTick(() => { // 这一步重要!!它可以减少不必要的请求与渲染,确保请求的顺序,否则你滑动时可能一次性会请求好几次API这样数据就容易错乱pageNo.value += 1;getData(); loading.value = false;});} else {loading.value = false;}
};
</script>

效果如图:

20240820-142332

相关文章:

  • docker升级docker pull mysql:5.7.37异常
  • C++ 11---lambda表达式与包装器
  • 整体思想以及取模
  • Spring @Async注解【总结记录】
  • 点对点专线的带宽管理和控制功能解析
  • 【AI趋势9】开源普惠
  • c语言练习题1
  • APP 整改要求 “未清晰明示高德SDK处理IP地址、SSID、BSSID的目的、方式和范围。”
  • 【QT】——1_QT学习笔记
  • 学懂C++(三十九):网络编程——深入详解 TCP 和 UDP 的区别和应用场景
  • Moodle与ONLYOFFICE集成如何实现智能教学管理
  • python中dataframe的iloc和loc的使用区别
  • 秋叶SD整合安装包更新了!8月最新版4.9【附下载】
  • Qt 0821作业
  • 用友crm客户关系管理help.php存在任意文件读取漏洞解析
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • express + mock 让前后台并行开发
  • Facebook AccountKit 接入的坑点
  • js数组之filter
  • k8s如何管理Pod
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MySQL几个简单SQL的优化
  • php面试题 汇集2
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vuex 笔记整理
  • windows下如何用phpstorm同步测试服务器
  • XForms - 更强大的Form
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于web的全景—— Pannellum小试
  • 使用API自动生成工具优化前端工作流
  • 小试R空间处理新库sf
  • 再谈express与koa的对比
  • C# - 为值类型重定义相等性
  • NLPIR智能语义技术让大数据挖掘更简单
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #《AI中文版》V3 第 1 章 概述
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #Spring-boot高级
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (003)SlickEdit Unity的补全
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (pycharm)安装python库函数Matplotlib步骤
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm高校实验室 毕业设计 800008
  • (接口封装)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (学习总结16)C++模版2
  • (一)基于IDEA的JAVA基础12
  • (幽默漫画)有个程序员老公,是怎样的体验?