Debug-029-el-table实现自动滚动分批请求数据

前情提要

        最近做了一个小优化,还是关于展示大屏方面的。大屏中使用el-table展示列表数据,最初的方案是将数据全部返回,确实随着数据变多有性能问题,有时请求时间比较长。这里做的优化就是实现列表的滚动到距离底部一定高度时再次请求接口数据,实现分批请求提升性能。然后这里也实现让el-table自动滚动的功能

思路

  (1) 自动滚动:

        先给el-table绑定ref,拿到组件实例,找到真实滚动的那部分内容。这一步需要耐心点。然后就是监听这个滚动区域的滚动事件,利用视图展示区域(clientHeight)+垂直方向超出部分(scrollTop)和 内容实际的总高度三者的(scrollHeight)的关系判断内容是否滚动到底部,需要添加定时器增加scrollTop的高度,以达到自动滚动的效果,最终滚动完毕给出判断回到el-table顶部重新滚动(scrollTop置为0)。

备注:最初是查找官方文档,发现使用el-tbale的话没有直接可以支持自动滚动的属性,但是vue3中有v-infinite-scroll这个指令,不过我没试过放在el-table中使用,有机会各位可以去尝试一下。

  (2) 分批次请求数据

        还是要先拿到实际滚动的那块区域,然后还是监听滚动事件,由于增加了自动滚动,我开始的思路是把自动滚动和用户手动滚动两个情况分开,不过我在review的时候尝试了一下,确实是不需要区分的,不管是自动滚动还是手动滚动这里只需要考虑好滚动到合适的高度请求数据即可,拼接在之前的tbaleData中,直至达到总数停止

自动滚动

代码:

//自动滚动封装在table中,是否自动滚动由父组件传入autoScroll决定//onMounted:组件挂载完成后执行。若autoScroll为真,则调用  //createScroll初始化滚动功能。
onMounted(() => {props.autoScroll && createScroll()
})//onUnmounted:组件卸载前执行。若autoScroll为真,则调用  //clearScroll清理滚动相关资源
onUnmounted(() => {props.autoScroll && clearScroll()
})const clearScroll = () => {if(!props.autoScroll) returnclearInterval(timer)timer = null
}
const createScroll = () => {if(!props.autoScroll) returnclearScroll()// 拿到 tableconst table = tableref.value.layout.table.refs// 拿到可以滚动的元素const tableWrapper = table.bodyWrapper.firstElementChild.firstElementChildtimer = setInterval(() => {tableWrapper.scrollTop += 1.5// 判断是否滚动到底部,如果到底部了置为0(可视高度+距离顶部=整个高度)if (tableWrapper.clientHeight + tableWrapper.scrollTop >= (tableWrapper.scrollHeight - 5))tableWrapper.scrollTop = 0}, 100)
}

分批请求数据

代码:

const jyTableRef = ref<InstanceType<typeof ElTable>>()
const wrapRef = ref() // 滚动条实例
const pageNum = ref(1)
const count = ref('0') // 设备总数
const isRequest = ref(true) // 控制请求的时机// 获取实时监测表格数据
async function getRealTimeModelData(id: any) {if (mockData.value.length > +count.value) return // 如果已经超出最大范围,停止查询const result = await getRealTimeModelDataApi({groupId: id,pageSize: 50,pageNum: pageNum.value,//  环境变量// tenantId: 'jybfgs'})console.log('result', result)count.value = result.count || 0 // 从图表的接口获取总条数,列表的总数会变不能用mockData.value.push(...(result.list || [])) // 将每次请求的数据拼接缓存在前端// isUserScroll.value = 2isRequest.value = false// mockData.value = res.list || []sortTableData(sortName.value, sortType.value)filterHandler(filterDeviceStatus.value, filterProp.value)
}// 滚动事件
const scrolling = async (event:any) => {console.log('scrolling')const scrollHeight = event.target.scrollHeightconst clientHeight = event.target.clientHeight// isScrollingBottom.value = scrollHeight - clientHeight === event.target.scrollTop// 是否滚动的底部console.log('event', isRequest.value, scrollHeight, clientHeight, (scrollHeight - clientHeight), event.target.scrollTop)// 有时接口数据返回较慢,这里不在触底时请求刷新,而是在内容达到一半时请求新数据if (((scrollHeight - clientHeight) / 2) <= event.target.scrollTop && !isRequest.value) {console.log('自动滚动')isRequest.value = !isRequest.value// 页码+1pageNum.value++getRealTimeModelData(props.id)}
}onMounted(() => {getRealTimeModelData(props.id)console.log(1234455, jyTableRef.value!.tableref.scrollBarRef.wrapRef)// 获取表格内的滚动条,并监听滚动事件wrapRef.value = jyTableRef.value!.tableref.scrollBarRef.wrapRef// 监听滚动事件wrapRef.value.addEventListener('scroll', scrolling)
})onUnmounted(() => {// if (timer) clearInterval(timer)// 移出监听事件wrapRef.value.removeEventListener('scroll', scrolling)
})

小结&收获

        由于时间有限,这里的代码确实不能直接cv,我是直接从项目中截取的关键部分,省略了一些引用或者变量声明。对我自己来讲我已经测试很多遍了,所以才比较清晰。这里的代码主要是一个备份和引导作用。对大家来说我觉得重要的还是思路吧,我看大家常规思路都是这样做的,大家可以下去自己尝试。通过回顾之前开发的这个功能,我想再总结一下对于这个需求几个比较重要关键的技术点和经验吧:

(1)首先如果是使用开源的ui组件库比如elementui,那么肯定是先去官网看对应组件是否存在相关功能的属性和方法,如果没有可以直接使用的或者相关辅助我们实现功能的话再去自己百度也好或者AI调研开发。

(2)这次大屏的两个功能点都离不开的一点就是我们对于el-table都去给它绑定ref,目的就是拿到它的组件实例,然后可以方便我们操作上面的方法,dom和属性,以后的开发中类似的功能都是离不开组件实例的,经常会用到。这一点我认为需要多多练习,自然能熟能生巧。

(3)监听滚动事件。这一步算是这次迭代的核心内容吧。这里我们又要知道的两个东西,一个是监听滚动事件wrapRef.value.addEventListener('scroll', scrolling),addEventListener这个监听器非常好用,对于所有dom的相关操作都可以用它来监听。也是熟能生巧,其中的event形参中存在所有你想要的属性;另一个就是这次功能的判断条件(请求数据的时机)一个常见公式:

//当数据滚动到列表底部时(数据加载完毕时)此等式成立内容总高度   -  视图高度      =    内容超出顶部的高度
scrollHeight  - clientHeight  = scrollTop

正常来讲(scrollHeight  - clientHeight  )的高度一定是大于 scrollTop的,只有当数据滚动到列表底部时此等式成立,也即是数据加载完的时候成立。所以常规思路就是利用这个时机去来触发新请求拼接新数据。当然这三个属性在监听的scrolling方法中的event形参中全都有。

        不过在我的代码中我没有在触底的时候二次请求,而是选择在内容滚动到一半的时候就提前请求第二次的数据。

(((scrollHeight - clientHeight) / 2) <= event.target.scrollTop && !isRequest.value)

这里还准备了一个变量 isRequest去防止满足条件多次请求的情况,并且接口返回时间有时候比较长,由于自动滚动会导致触底回到列表第一条重头滚动,所以不选择在触底时请求而是在内容滚动一半就提前请求。

而且还有一点需要注意的是,条件一定不能给等于而是要给小于等于或者大于等于,因为当浏览器放缩不同时,是会导致这个高度不存在整数的情况,等式就不成立了,所以尽量给一个范围,这样就必然会被触发。

下面是菜鸟教程的原话:

这三者之间的关系不熟悉的话具体详解再推荐一篇文章给大家:

JavaScript第 11 篇,JavaScript中的scrollTop(JavaScript中的scrollTop,JS滚动到顶部)-CSDN博客文章浏览阅读1.9w次,点赞25次,收藏96次。⭐scrollTop是JavaScript中一个非常有用且重要的方法,它用于获取或设置元素的垂直滚动条位置,实现各种滚动相关的功能,无论是回到顶部、滚动到指定位置还是监听滚动事件,都需要用到scrollTop,在本文中,我们将深入了解scrollTop的用法和实际应用,这是一张scrollTop的关系图,仅供参考_scrolltophttps://blog.csdn.net/weixin_65793170/article/details/129836174(4)封装自定义指令。对于这种列表滚动来讲,一般需要操作dom的情况可以封装为自定义指令,然后原则就是“开箱即用”,尽量让别人直接使用即可,不需要添加太多逻辑,尽量封装到位。方便之后有需要滚动的table可以一次到位,方便之后开发。(前辈经验:如果是涉及到dom监听,操作相关的服用,自定义指令是非常好的方案)

分享

        这里还有几篇我之前看到的思路差不多,这里给大家分享一下,便于大家加深理解(代码不重要,思路很重要)。

el-table不使用分页组件,仅滚动条实现加载下一页数据_el-table滚动加载-CSDN博客文章浏览阅读622次,点赞4次,收藏3次。el-table不使用分页组件,仅滚动条实现加载下一页数据_el-table滚动加载https://blog.csdn.net/csdnyp/article/details/136315835

使用el-table实现自动滚动_el-table自动滚动-CSDN博客文章浏览阅读1.4k次,点赞4次,收藏6次。在前端开发大屏的时候,我们会用到表格数据展示,有时候为了使用户体验更加好,会增加表格自动滚动。下边我将以示例代码,用element UI的el-table来讲一下。2 通过判断dom的scrollHeight和scrollTop的关系,来实现滚动。1 .增加dom监听,鼠标放上去的时候不滚动,鼠标离开的时候滚动。3.当不需要使用,或者表格需要重新渲染的时候,我们需要清掉定时器。_el-table自动滚动https://blog.csdn.net/weixin_38912662/article/details/140657947ant design vue中table表格滚动加载实现思路_vue.js_脚本之家在处理一写数据量特别大的情况下,我们不能把后端的数据一次性全部拿到前端在table表格中展示,为了考虑性能优化,使用了滚动加载表格数据,这篇文章主要介绍了ant design vue中table表格滚动加载实现思路,需要的朋友可以参考下icon-default.png?t=O83Ahttps://www.jb51.net/javascript/323819ttr.htmel-table实现表格滚动上拉加载更多(Vue3)_el-table滚动加载-CSDN博客文章浏览阅读1k次。【代码】el-table实现表格滚动上拉加载更多(Vue3)_el-table滚动加载https://blog.csdn.net/qq_48665028/article/details/136883338

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

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

相关文章

【银河麒麟高级服务器操作系统实例】金融行业TCP连接数猛增场景的系统优化

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 服务器环境以及配置 物理机/虚拟机/云/容器 物理…

项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/143105881 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

python中frida的安装+frida-server(雷电模拟器)保姆级安装教程

一.安装雷电模拟器 雷电模拟器官网 直接下载安装即可 &#xff08;1&#xff09;打开必要权限 雷电模拟器的设置已完毕 二.安装adb工具 本文以autox.js来实现adb操作 &#xff08;1&#xff09;vscode中下载auto.js插件 &#xff08;2&#xff09;雷电模拟器下载autox.j…

【大模型实战篇】大模型分词算法Unigram及代码示例

1. 算法原理介绍 与 BPE 分词&#xff08;参考《BPE原理及代码示例》&#xff09;和 WordPiece 分词&#xff08;参考《WordPiece原理及代码示例》&#xff09;不同&#xff0c;Unigram 分词方法【1】是从一个包含足够多字符串或词元的初始集合开始&#xff0c;迭代地删除其中的…

Spring Boot Druid 数据库连接池入门

1. Druid 单数据源 1.1 引入依赖 在 pom.xml 文件中&#xff0c;引入相关依赖。 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

《异常处理与资源管理:构建稳定程序的关键纽带》

#1024程序员节&#xff5c;征文# 在软件开发的广袤领域中&#xff0c;异常处理和资源管理如同两座坚实的基石&#xff0c;共同支撑着程序的稳定运行。它们之间的关系紧密而微妙&#xff0c;对于构建可靠、高效的软件系统起着至关重要的作用。让我们深入探讨异常处理和资源管理…

idea项目搭建的四种方式: 一(以idea2017为例)

目录 1. 普通java项目 2. 普通JavaWEB项目 3. maven的JavaWEB项目 4. maven的java项目 1. 普通java项目 ①点击“Create New Project”&#xff1b; ②选择“Java”&#xff0c;选择自己安装的jdk&#xff0c;点击“Next”&#xff1b; ③填好项目名称和路径&#xff1b;…

【LeetCode】动态规划—2466. 统计构造好字符串的方案数(附完整Python/C++代码)

动态规划—2466. 统计构造好字符串的方案数 题目描述前言基本思路1. 问题定义举例&#xff1a; 2. 理解问题和递推关系动态规划思想&#xff1a;状态定义&#xff1a;状态转移方程&#xff1a;边界条件&#xff1a; 3. 解决方法动态规划方法伪代码&#xff1a; 4. 进一步优化5.…

MATLAB图像检索系统

MATLAB图像检索系统应用背景 基于内容的图像检索&#xff08;CBIR&#xff09;是一个非常热门的研究领域。本文在对颜色特征、形状特征和纹理特征的研究基础上&#xff0c;将三种特征结合在一起&#xff0c;实现了可以自定义权重的综合特征的图像检索系统&#xff0c;并在 平…

推动AI技术研发与应用,景联文科技提供专业高效图像采集服务

景联文科技提供专业图像采集服务&#xff0c;涵盖多个领域的应用需求。 包含人体图像、人脸图像、手指指纹、手势识别、交通道路、车辆监控等图像数据集&#xff0c;计算机视觉图像数据集超400TB&#xff0c;支持免费试采试标。 高质量人像采集服务&#xff1a;支持不同光线条件…

网络知识总结

osi七层模型 osi七层模型分为&#xff1a;应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层 应用层&#xff1a;客户端与服务端之间建立一个通话界面表示层&#xff1a;对数据进行语言转换&#xf…

【Unity】Unity Shader学习笔记(八)基础纹理2:高度纹理、法线纹理、模型空间下的法线纹理、切线空间下的法线纹理光照计算

文章目录 凹凸映射法线纹理设置高度纹理&#xff08;Height Map&#xff09;法线纹理&#xff08;Normal Map&#xff09;模型空间的法线纹理切线空间的法线纹理优劣对比 切线空间下的法线纹理光照计算最终效果完整代码TANGENT语义内置宏 TANGENT_SPACE_ROTATIONObjSpaceLightD…

028.魔改浏览器-抓取closed的shadowRoot下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…

【火山引擎】AIGC图像风格化 | 风格实践 | PYTHON

目录 1 准备工作 2 实践 代码 效果图 1 准备工作 ① 服务开通 确保已开通需要访问的服务。您可前往火山引擎控制台,在左侧菜单中选择或在顶部搜索栏中搜索需要使用的服务,进入服务控制台内完成开通流程。

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…

足浴店+闸机+智能衣柜+门票系统一体化管理系统解决方案——未来之窗行业应用跨平台架构

一、足浴店收银台 二、智能柜子 三、智能闸机 在收银台开台后&#xff0c;直接通过手环开闸机 1. 提高效率&#xff1a;减少了顾客等待人工操作闸机的时间&#xff0c;能够快速进入店内&#xff0c;提升顾客的进店体验。 2. 便捷服务&#xff1a;无需繁琐的钥匙或卡片&#xf…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

LLM:reward-model-deberta-v3-large-v2模型结构

https://hf-mirror.com/OpenAssistant/reward-model-deberta-v3-large-v2是在做合成数据的质量打分时的奖励模型。 模型依托deberta-v3-large-v2编码模型&#xff0c;给定一个qa对&#xff0c;能够给出一个分数来衡量qa对的质量。没有公开训练细节&#xff0c;由于模型的输出层…

llama.cpp 去掉打印,只显示推理结果

llama.cpp 去掉打印&#xff0c;只显示推理结果 1 llama.cpp/common/log.h #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__) #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__) #define LOG_ERR(…

基于微信小程序的电影交流平台

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…