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) return
  clearInterval(timer)
  timer = null
}
const createScroll = () => {
  if(!props.autoScroll) return
  clearScroll()
  // 拿到 table
  const table = tableref.value.layout.table.refs
  // 拿到可以滚动的元素
  const tableWrapper = table.bodyWrapper.firstElementChild.firstElementChild
  timer = 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 = 2
  isRequest.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.scrollHeight
  const 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
    // 页码+1
    pageNum.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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python语法结构(二)(Python Syntax Structure II)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Shell编程-函数

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编程&#xff0c;…

在Xshell中查看日志文件详情

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

排序06 粗排模型

前面讲的多目标模型主要是用于精排。 粗排&#xff1a;尽量减少推理的计算量&#xff0c;牺牲准确性确保线上推理的速度足够快。 精排模型和双塔模型 中间的神经网络被多个任务共享 因此&#xff0c;前期融合模型用于召回&#xff0c;后期融合可以作为精排。 小红书粗排的三…

Shell案例之一键部署mysql

1.问题 我认为啊学习就是一个思考的过程&#xff0c;思考问题的一个流程应该是&#xff1a;提出问题&#xff0c;分析问题&#xff0c;解决问题 在shell里部署mysql服务时&#xff0c;我出现一些问题&#xff1a; 1.安装mysql-server时&#xff0c;没有密钥&#xff0c;安装…

PCL 基于中值距离的点云对应关系

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 获取中值距离筛选后的对应点对 2.1.2获取初始点对 2.1.3可视化 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇…

NetSuite Transfer Order Saved Search的关键字段取值

针对于Transfer Order的Saved Search&#xff0c;我们最经常遇到的问题就是如何取到From Location&#xff0c;To Location&#xff0c;Quantity Fulfilled&#xff0c;Quantity Received这几个值。 原生的TO Register无法取到对应的信息&#xff0c;系统中也没有相应的标准Se…

关于vue3中如何实现多个v-model的自定义组件

实现自定义组件<User v-model"userInfo" v-model:gender"gender"></User> User组件中更改数据可以同步更改父组件中的数据&#xff1a; 1 父组件&#xff1a; <User v-model"userInfo" v-model:gender"gender">&…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十七集:制作第一个BOSS苍蝇之母

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、战斗场景Battle Scene相关逻辑处理 1.防止玩家走出战斗场景的门2.制作一个简单的战斗场景二、制作游戏第一个BOSS苍蝇之母 1.导入素材和制作相关动画2.制作…

C#从零开始学习(GameObject实例)(unity Lab3)

这是书本中第三个unity Lab 在这次实验中,将学习如何使用C#编写代码用unity编写C#代码 GameObject实例 本次将完成的工作 将游戏资产配置在文件夹中创建材质把GameObject变成预制件脚本控制游戏防止球体重叠 将游戏资产配置在文件夹中 Script放代码 Prefabs放预制件 MAteria…

PostgreSQL的学习心得和知识总结(一百五十五)|[performance]优化期间将 WHERE 子句中的 IN VALUES 替换为 ANY

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

RabbitMQ系列学习笔记(八)--发布订阅模式

文章目录 一、发布订阅模式原理二、发布订阅模式实战1、消费者代码2、生产者代码3、查看运行结果 本文参考&#xff1a; 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、发布订阅模式原理 在开发过程中&…

大数据治理的核心思想

目录 ​编辑1.1 大数据治理的定义与重要性 1.2 大数据治理的关键要素 1.2.1 数据质量管理 1.2.2 数据安全管理 1.2.3 合规性管理 1.2.4 数据共享与协作 1.2.5 数据驱动的决策 二、对未来趋势的看法 2.1 技术发展趋势 2.1.1 人工智能与机器学习 2.1.2 云计算与边缘计…

Python数据处理工具笔记 - matplotlib, Numpy, Pandas

matplotlib, Numpy, Pandas 由于有很多例子是需要运算后的图表看着更明白一些&#xff0c;很明显csdn不支持 所以用谷歌的Colab(可以理解为白嫖谷歌的云端来运行的jupyter notebook)来展示&#xff1a; Colab链接(需要梯子)&#xff1a;Python数据挖掘 当然如果实在没有梯子&…

算法打卡 Day43(动态规划)-背包问题 + 分割等和子集

文章目录 0-1 背包问题理论基础0-1 背包问题滚动数组Leetcode 416-分割等和子集题目描述解题思路 0-1 背包问题理论基础 0-1 背包一般的题目要求是给定不同重量不同价值的物品&#xff0c;每个物品只有一个&#xff0c;已知背包中最大的负重&#xff0c;求在此限制条件下背包中…

达那福发布新品音致系列:以顶尖降噪技术,开启清晰聆听新篇章

近日&#xff0c;国际知名助听器品牌达那福推出其最新研发的音致系列助听器。该系列产品旨在通过顶尖的声音处理技术&#xff0c;直面助听器市场中普遍存在的挑战——如何在噪声环境中提供清晰的语音辨识。 根据助听器行业协会2022年的调查数据&#xff0c;高达86%的佩戴者认为…

数据结构——二叉树的基本操作及进阶操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》116 ~ 122页 及 《数据结构教程》201 ~ 213页 重点 树的基本实现并不难&#xff0c;重点在于对递归的理解才是树这部分知识带来的最大收…

jmeter学习(8)界面的使用

1、新建test plan 3、 打开文件 4、保存 5、剪切 6、复制 7、粘贴 8、所有线程组展开 9、所有线程组收缩 10、置灰&#xff0c;操作后无法使用 11、执行 13、清空当前线程组结果 14、清空所有线程组结果 15、函数助手 搜索&#xff0c;可以用于搜索某个请求&#x…

Java基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

使用OpenCV进行视频边缘检测:案例Python版江南style

1. 引言 本文将演示如何使用OpenCV库对视频中的每一帧进行边缘检测&#xff0c;并将结果保存为新的视频文件。边缘检测是一种图像处理技术&#xff0c;它可以帮助我们识别出图像中不同区域之间的边界。在计算机视觉领域&#xff0c;这项技术有着广泛的应用&#xff0c;比如物体…