Vue项目实践:使用滚动下拉分页优化大数据展示页面【通过防抖加标志位进行方案优化】

Vue项目实践:使用滚动下拉分页优化大数据展示页面

前言

        传统的分页机制通过点击页码来加载更多内容,虽然直观,但在处理大量数据时可能会导致用户体验不佳。相比之下,滚动下拉分页能够在用户滚动到页面底部时自动加载更多内容,既节省了用户操作,也使得数据的展示更加流畅自然。

准备工作

scrollTop,clientHeight,scrollHeight 详解

Vue项目实践:使用滚动下拉分页优化大数据展示页面

  1. scrollTop
    定义:scrollTop 属性表示元素在垂直方向上已经滚动过的距离。换句话说,它衡量的是元素内容顶部与视口顶部之间的距离。这个值通常是非负的,单位是像素。
    应用场景:当你需要知道元素内部滚动了多少或者想要手动设置滚动位置时,会用到这个属性。例如,实现“回到顶部”按钮功能时,可以设置 scrollTop0来瞬间返回顶部。
  2. clientHeight
    定义:clientHeight 表示元素可视区域的高度,即元素内容区的高度加上垂直边框和内边距(padding),但不包括水平滚动条(如果存在)、外边距或滚动条本身。这个值总是正的,单位也是像素。
    应用场景:当你需要计算元素实际显示给用户的高度时会用到 clientHeight,比如判断元素是否完全在视口内显示。
  3. scrollHeight
    定义:scrollHeight 表示元素的总高度,包括不可见的部分,也就是元素内容的总高度,不论内容是否在当前视口内可见。这包括了所有内边距、边框,但不包括外边距。对于没有滚动条的元素,scrollHeight 等于元素的 clientHeight
    应用场景:当你需要了解元素内容的完整高度,特别是用于判断是否还有更多内容可以滚动查看时,scrollHeight 就显得非常重要。比如,结合 scrollTopclientHeight来判断是否已经滚动到底部,从而实现无限滚动加载功能。

实现思路

在实现一个无限滚动(滚动加载更多)功能时,可以通过比较 scrollTop + clientHeightscrollHeight 来判断是否接近滚动底部。

实现

效果

Vue项目实践:使用滚动下拉分页优化大数据展示页面

HTML\CSS结构

注意:一定要设置需要滚动盒子device-content的高度,及其overflow: hidden; overflow-y: auto;样式属性,使其具有滚动。通过handleScroll进行监听父盒子的滚动状态,其中device-box是父盒子中的内容列表。

<a-spin dot :loading="deviceLoading" tip="正在加载..."><div class="device-content" @scroll="handleScroll"><div v-for="device in deviceList" :key="device.id" class="device-box"><div class="device-con-box"><div class="device-con-img"></div><div class="device-con-text"><div class="device-con-text-top">{{device.detectDeviceFullName}}</div><div class="device-con-text-bottom"><spanv-if="device.runStatusKey === 'device_run_status:offline'"class="offline">离线</span><spanv-if="device.runStatusKey === 'device_run_status:working'"class="working">工作</span><spanv-if="device.runStatusKey === 'device_run_status:waiting'"class="waiting">空闲</span><spanv-if="device.runStatusKey === 'device_run_status:breakdown'"class="breakdown">故障</span></div></div></div></div></div>
</a-spin>

CSS结构:

.device-content {width: 100%;height: 645px;overflow: hidden;overflow-y: auto;.device-box {cursor: pointer;height: 148px;width: 400px;float: left;border-radius: 12px;border: 1px solid #ccc;margin-bottom: 6px;margin-right: 6px;.device-con-box {height: 98px;width: 305px;margin: 0px auto;margin: 20px 68px 37px 48px;display: flex;.device-con-img {height: 80px;width: 80px;background: url('../../assets/images/deviceImg.png');}.device-con-text {width: 220px;height: 100%;padding-left: 16px;.device-con-text-top {height: 68px;width: 120%;padding-top: 23px;font-size: 14px;font-weight: 400;color: #000;}.device-con-text-bottom {height: 30px;width: 100%;font-family: Microsoft YaHei UI;font-size: 24px;font-weight: 700;line-height: 22px;text-align: left;color: #19cd61;}.line-division {margin-left: 10px;margin-right: 10px;color: #e7e7e7;font-size: 18px;position: relative;top: -3px;}}}}
}

监听父盒子函数handleScroll

检查用户是否已经滚动到容器的底部,如果滚动到了底部,再次判断页面的数据是否大于总条数,如果小于总条数,则继续进行加载下一页,如果大于总条数,则不进行加载。【距离顶部的距离+可视区高度>=元素总高度

// eslint-disable-next-line no-use-before-define
const handleScroll = (e: Event) => {const target = e.target as HTMLElement;// 检查用户是否已滚动到容器底部附近if (target.scrollTop + target.clientHeight >= target.scrollHeight - 10) {// 此条件检查是否还有更多页面的数据需要加载if (pagination.current * pagination.pageSize < pagination.total) {fetchData({ ...basePagination, current: pagination.current + 1 });}}
} 

但是会出现,当触底的时候,多次请求分页列表,导致页面存储的数据大于数据库中数据的总条数。

Vue项目实践:使用滚动下拉分页优化大数据展示页面
处理以上触底时多次请求有两种方式可解决

使用防抖技术

使用防抖技术,确保在短时间内只处理一次滚动事件。

// 防抖函数
function debounce(func: any, wait: any) {let timeout: number | undefined;// eslint-disable-next-line func-namesreturn function (...args: any[]) {// eslint-disable-next-line @typescript-eslint/no-this-aliasconst context: any = this;clearTimeout(timeout);timeout = window.setTimeout(() => {func.apply(context, args);}, wait);};
}

添加标志位

添加一个标志位isFetching 来防止在请求完成之前再次发送请求。

const isFetching = ref(false);const fetchData = async (params: PolicyParams = { current: 1, pageSize: 20 }
) => {if (isFetching.value) return;isFetching.value = true;setLoading(true);try {const { data } = await getDetectDeviceMonitorPage(params);pagination.current = params.current;pagination.total = data.total;if (params.current === 1) {deviceList.value = data.data;} else {deviceList.value = [...deviceList.value, ...data.data];}} catch (err) {// you can report use errorHandler or other} finally {setLoading(false);isFetching.value = false;}
};const handleScroll = (e: Event) => {const target = e.target as HTMLElement;// 检查用户是否已滚动到容器底部附近if (target.scrollTop + target.clientHeight >= target.scrollHeight - 10) {// 此条件检查是否还有更多页面的数据需要加载if (!isFetching.value && pagination.current * pagination.pageSize < pagination.total) {fetchData({ ...basePagination, current: pagination.current + 1 });}}
};

通过添加防抖和标志位后的效果
Vue项目实践:使用滚动下拉分页优化大数据展示页面
完美解决触底出现多次分页请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349487.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用difflib实现文件差异比较用html显示

1.默认方式&#xff0c;其中加入文本过长&#xff0c;需要换行&#xff0c;因此做 contenthtml_output.replace(</style>,table.diff td {word-wrap: break-word;white-space: pre-wrap;max-width: 100%;}</style>)&#xff0c;添加换行操作 ps&#xff1a;当前te…

人工智能和机器学习这两个概念有什么区别?

什么是人工智能&#xff1f; 先来说下人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI&#xff0c;通俗来讲就是用机器去做在过去只有人能做的事。 人工智能最早是由图灵提出的&#xff0c;在1950年&#xff0c;计算机…

Syncovery:跨平台高效文件备份与同步的得力助手

在数字化时代&#xff0c;数据安全与文件同步已成为个人及企业不可或缺的需求。Syncovery作为一款专为Mac和Windows用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;赢得了广泛赞誉。 一、强大备份功能 Syncovery支持多种备份方案和数据格…

AI宣传文案软件有哪些?5款AI软件推荐

AI宣传文案软件有哪些&#xff1f;AI宣传文案软件在现代营销和创意产业中扮演着越来越重要的角色&#xff0c;它们凭借先进的自然语言处理、机器学习和深度学习技术&#xff0c;不仅解放了创作者的双手&#xff0c;还大大提升了文案的生成效率和质量。这些软件能够精准捕捉用户…

防火墙安全管理

大多数企业通过互联网传输关键数据&#xff0c;因此部署适当的网络安全措施是必要的&#xff0c;拥有足够的网络安全措施可以为网络基础设施提供大量的保护&#xff0c;防止黑客、恶意用户、病毒攻击和数据盗窃。 网络安全结合了多层保护来限制恶意用户&#xff0c;并仅允许授…

分布式事务的八种方案解析(1)

针对不同的分布式场景业界常见的解决方案有2PC、TCC、可靠消息最终一致性、最大努力通知等方案&#xff0c;以下总结8 种常见的解决方案&#xff0c;帮助大家在实际的分布式系统中更好地运用事务。 1.2PC 二阶段提交协议&#xff08;Two-phase commit protocol&#xff09;&…

微信小程序毕业设计-实验室管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

(三十九)Vue之集中式的状态管理机制Vuex

目录 概念vuex的核心概念State&#xff08;状态&#xff09;Getters&#xff08;获取器&#xff09;Mutations&#xff08;突变&#xff09;Actions&#xff08;动作&#xff09; 搭建vuex环境基本使用getters的使用 上一篇&#xff1a;&#xff08;三十八&#xff09;Vue之插槽…

安装台式电脑网卡驱动

安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时&#xff0c;当不知道怎么办时&#xff0c;以下的方法&#xff0c;可以作为一…

工业烤箱设备厂家:专业制造,助力工业发展

随着现代工业的不断发展&#xff0c;工业烤箱设备在各个领域的应用越来越广泛。作为专业的工业烤箱设备厂家&#xff0c;我们致力于为客户提供高质量、高效率的烤箱设备&#xff0c;助力工业生产的顺利进行。 工业烤箱设备在工业生产中扮演着至关重要的角色。无论是电子、化工、…

微信小程序查分易如何使用?

期末马上到了&#xff0c;老师们又开始为发放成绩而头疼了&#xff0c;堆积如山的试卷&#xff0c;密密麻麻的分数&#xff0c;还有那些不断响起的家长电话&#xff0c;真是让人心烦。别担心&#xff0c;今天就让我来介绍一个让老师“偷懒”神器——查分易微信小程序 第一步&am…

Java多线程-StampedLock(原子读写锁)

StampedLock 是读写锁的实现&#xff0c;对比 ReentrantReadWriteLock 主要不同是该锁不允许重入&#xff0c;多了乐观读的功能&#xff0c;使用上会更加复杂一些&#xff0c;但是具有更好的性能表现。StampedLock 的状态由版本和读写锁持有计数组成。 获取锁方法返回一个邮戳&…

报名进行中 | ISCSLP2024 对话语音克隆挑战赛(CoVoC)

晴数智慧(Magic Data)联合西北工业大学音频语音与语言处理研究组(ASLPNPU)、新加坡资讯通讯研究院(I2R)、深圳大数据研究院(SRIBD)、香港中文大学(深圳)等多家单位在2024年中文口语语言处理国际会议(ISCSLP2024)上推出对话语音克隆挑战赛(Conversational Voice Clone Challenge…

【leetcode--同构字符串】

要求&#xff1a;判断两个字符串的形式是不是一致&#xff0c;即是不是AABC或者ABBBCC这种。 trick&#xff1a;使用set&#xff08;&#xff09;结合zip&#xff08;&#xff09;。 set&#xff08;&#xff09;用法&#xff1a;用于创建一个不包含重复元素的集合 zip&#…

FPGA+金融|硬件行情加速系统 打造极速交易场景

会议时间&#xff1a;2024年06月20日&#xff08;周四&#xff09;下午13:50 FPGA金融|硬件行情加速系统 打造极速交易场景_中科亿海微_芯有灵犀 智创未来

安装前端依赖node-sass报错

文章目录 问题1&#xff1a;node-sass报错问题2&#xff1a;node-gyp报错问题3&#xff1a;node-sass再次报错问题4&#xff1a;node-sass三次报错 问题1&#xff1a;node-sass报错 问题描述&#xff1a;经常会碰到一个新的项目安装依赖时&#xff0c;会报node-sass版本的问题…

《C++ Primer》导学系列:第 1 章 - 开始

1.1 编写一个简单的C程序 概述 本小节介绍了如何编写和运行一个简单的C程序&#xff0c;帮助初学者了解C程序的基本结构和编译运行过程。 编写第一个C程序 我们从一个简单的C程序开始&#xff0c;它的功能是在控制台输出 "Hello, World!"。这是学习任何编程语言的…

File及典型案例

File File对象表示一个路径&#xff0c;可以是文件的路径&#xff0c;也可以是文件夹的路径 这个路径可以是存在的&#xff0c;也允许不存在 常见的构造方法 图来自黑马程序员网课 package com.lazyGirl.filedemo;import java.io.File;public class Demo1 {public static vo…

easyexcel的简单使用(execl模板导出)

模板支持功能点 支持列表支持自定义头名称支持自定义fileName支持汇总 模板示例 操作 pom引入 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version></dep…

github 本地仓库上传及报错处理

一.本地文件上传 这里为上传部分&#xff0c;关于gitbash安装配置&#xff0c;读者可自行搜索&#xff0c;由于已经安装完成&#xff0c;未进行截图保存&#xff0c;这里便不做赘述。 1.登录git账号并创建一个仓库 点击仓库打开后会看到这个仓库的网址链接&#xff08;这个链…