滚动懒加载升级版:添加滚动回收策略

news2024/9/30 3:33:27

在之前的1.0版本的基础上,添加滚动回收策略,保持页面只保留固定数量的数据,优化渲染

否则一直往数组里push内容,当数组长度过大,可能页面会崩溃(本需求是日志列表,由于日志数据可能会非常庞大,所以添加回收策略,如果列表数据不会很大,可以不用回收)

1.0版本代码如下:

vue3——利用自定义指令实现下拉框分页懒加载_vue3 el-select懒加载-CSDN博客

关于clientHeight、scrollTop和scrollHeight的关系

因此,可以利用这个关系,写出滚动条滚动到最上面和最下面的距离,

最上面:DOM.scrollTop + DOM.clientHeight == DOM.scrollHeight

最下面:DOM.scrollTop==0

但是为了更流畅的用户体验,可以让滚动条即将触顶或即将触底的时候就触发回调,可以加个阈值。


在该实践中,一页数据为10条,保持页面的数据恒定在50条(5页数据),滚动条向下滑动触底时,若大于5页,在请求第六页的同时,回收第一页的内容;反之,滚动条向上滑动触顶时,重新请求被回收的数据,同时,回收数组最末尾的一页数据,以此类推,保持整个页面的DOM只渲染小于50条数据。

自定义指令代码如下:

(ps:相比1.0版本加了阈值,加了即将触顶的判断,还加了节流,防止多次重复触发)

//自定义指令:实现下拉框下拉到末尾时,加载下一页的内容
// 使用时传两个参数,一个是下拉框的class,一个是下拉框滚动到末尾时触发的函数,比如:
// v-el-select-loadmore="{
//   selector: '.myOption .el-select-dropdown .el-select-dropdown__wrap',
//   loadFunction: loadMore
// }"
import { scrollType } from '@/views/AdminConsole/logManage/tenantLog/tenantLogType'
export default {
  mounted(el, binding) {
    //解构传来的值
    const {
      value: { selector, loadFunction }
    } = binding
    const SELECTWRAP_DOM = document.querySelector(selector)
    //滚动事件添加节流,性能优化
    let topScrollTimeout = null
    let bottomScrollTimeout = null
    if (SELECTWRAP_DOM) {
      const scrollHandler = () => {
        //清空定时器
        if (topScrollTimeout) {
          clearTimeout(topScrollTimeout)
        }
        if (bottomScrollTimeout) {
          clearTimeout(bottomScrollTimeout)
        }
        bottomScrollTimeout = setTimeout(() => {
          const condition = SELECTWRAP_DOM.scrollTop + SELECTWRAP_DOM.clientHeight >= SELECTWRAP_DOM.scrollHeight - 2
          //滚动条滚到最下面
          if (condition) {
            loadFunction(scrollType.bottom)
          }
        }, 300)
        topScrollTimeout = setTimeout(() => {
          const scrollTop = SELECTWRAP_DOM.scrollTop
          const threshold = 2
          //滚动到最上面
          if (scrollTop <= threshold) {
            loadFunction(scrollType.top)
          }
        }, 300)
      }
      //赋值,为了方便销毁
      el.dom = SELECTWRAP_DOM
      el.event = scrollHandler
      //监听滚动事件
      SELECTWRAP_DOM.addEventListener('scroll', scrollHandler)
    }
  },
  beforeUnmount(el) {
    if (el.dom && el.event) {
      el.dom.removeEventListener('scroll', el.event)
    }
  }
}

index.vue 

/**
 * 滚动条触底的逻辑
 */
async function scrollToBottom() {
  //滚动到最下面
  startPage += 1
  endPage += 1
  //发请求,获得接口数据
  bottomLoading.value = true
  try {
    await getLogListWrap(copySearchObj.value, endPage)
  } catch (err) {
    proxy.$errorHandle(err)
  }
  tableData.push(...itemList)
  //删除原数组前10项
  tableData.splice(0, 10)
}
/**
 * 滚动条触顶的逻辑
 */
async function scrollToTop() {
  startPage -= 1
  endPage -= 1
  //发请求,获得接口数据
  topLoading.value = true
  try {
    await getLogListWrap(copySearchObj.value, startPage)
  } catch (err) {
    proxy.$errorHandle(err)
  }
  tableData.unshift(...itemList)
  //如果是最后一页,删掉原数组最后的项数
  if (endPage == totalPage - 1) {
    let lastItem = totalCount % 10
    tableData.splice(tableData.length - lastItem, lastItem)
  } else {
    //删掉原数组后10项
    tableData.splice(tableData.length - 10, 10)
  }
}
/**
 * 性能优化:只保留50条数据,tableData在尾部增加数据的时候,删除头部的部分数据,反之也是
 * @param flag 判断是滚动条是触底还是触顶
 */
async function loadMore(flag: String) {
  const { clientHeight, scrollHeight } = timelineRef.value
  let isBottom = flag === scrollType.bottom
  if (isBottom) {
    if (totalCount <= 50 || endPage == totalPage) {
      return
    }
    scrollToBottom()
    //让滚动条向上滚一些距离,方便下次继续触发
    nextTick(() => {
      timelineRef.value.scrollTo(0, scrollHeight - clientHeight - 10)
    })
  } else {
    //滚动到最上面
    if (totalCount <= 50 || startPage == 1) {
      return
    }
    scrollToTop()
    //让滚动条向下滚一些距离,方便下次继续触发
    nextTick(() => {
      timelineRef.value.scrollTo(0, 20)
    })
  }
}

ps:滚动条触顶或者触底时,必须要用scrollTo方法让滚动条向下或者向上走一点距离,否则滚动条的位置会保持不变,就不会触发下一次回调。因为回调触发的条件是触顶或者触底,而不是一直让滚动条呆在顶部或者底部,必须有接触的行为。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门基础知识41——【关于C++ 运算符——杂项运算符】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

URP custompasscustom render objects

https://dbbh666.blog.csdn.net/article/details/141296728?spm1001.2014.3001.5502 上一次 custom render pass的时候&#xff0c;直接是quad的渲染&#xff0c;如果想把任意对象绘制到FBO怎么写呢 参考这两个高手的文章&#xff0c;总结一下 https://www.bilibili.com/read…

换毛季猫咪化身掉毛怪,宠物浮毛如何清理?推荐用宠物空气净化器

我家现在有三只毛孩子&#xff0c;养宠的幸福是三倍&#xff0c;除毛的烦恼也是三倍。尤其还有两只是银渐层&#xff0c;掉毛量实在是太夸张了&#xff0c;衣服、地板、水杯家里到处都是。我也每天早晚都给它们梳毛&#xff0c;卫生也定期清理&#xff0c;可还是浮毛满天飞。 …

【前缀和】--- 初阶题目赏析

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 了解完一维和二维前缀和模板之后&#xff0c;我们来看几道题目感受前缀和的算法原理以及使用场景。 &#x1f3e0; 寻找数组的中心下标 &am…

多张图片拼接在线制作难吗?学会这招让拼接变得很简单

你是否曾遇到过这样的困境&#xff1f;手机里的照片堆积如山&#xff0c;想要在社交平台上分享&#xff0c;却发现限制多多&#xff0c;根本没办法一次性分享完所有的精彩瞬间。这真是让人既兴奋又苦恼的事情啊&#xff01; 记得上次旅行回来&#xff0c;我拍了一大堆照片&…

精益生产管理咨询师OS:我需要时间!!!

最近一位企业的老板和我聊起管理企业的问题&#xff1a;之前听说精益生产管理不错&#xff0c;就试着在企业推行精益生产管理&#xff0c;结果精益培训搞了一个多月, 课上完了,可总是感觉精益并没有在企业落地,反倒感觉越来越越迷茫了。还抱怨说请精益生产管理咨询师花了很多钱…

AI智能对话绘画二合一系统源码 输入文字就可以快速生成高清图片 带源代码包以及搭建部署教程

系统概述 AI 智能对话绘画二合一系统源码是一款集智能对话与绘画功能于一体的先进系统。它融合了人工智能、计算机视觉等多项技术&#xff0c;能够实现自然语言处理与图像生成的高度协同。 该系统通过对大量文本和图像数据的学习与训练&#xff0c;具备了理解用户意图、生成相…

智游剪辑1.7.0 发布

最近又简单给桌面版升级了一下&#xff0c;一起来看看有啥新功能吧 支持实时输出 之前的文字类功能一般都需要等一会才能给出完整结果&#xff0c;现在它支持实时显示输出结果了&#xff0c;不仅输出更快了&#xff0c;而且还可以实时看到效果 字幕生成功能优化 旧版的字幕生…

vscode开发uniapp项目教程

一&#xff0c;在HB编辑器中用命令行创建uniapp项目&#xff08;vitevue3TS) npx degit dcloudio/uni-preset-vue#vite-ts 项目名称注意&#xff1a;搭梯子在创建或者连手机网络创建&#xff0c;按官方提示的下载模板也行。 在HB编辑器中安装vue3插件 二&#xff0c;在vscod…

抽烟检测算法引领公共场所健康管理的未来抽烟检测算法方案源码

在现代社会&#xff0c;吸烟对公共健康的影响越来越受到关注。为应对这一挑战&#xff0c;智能抽烟检测算法作为一种前沿技术&#xff0c;正逐渐成为公共场所健康管理的得力助手。这些算法通过先进的计算机视觉和深度学习技术&#xff0c;能够实时监控和识别吸烟行为&#xff0…

Linux基础1-基本指令5(more,less,head,tail, | ,find)

本章继续整理其他linux基本指令 一.本章重点 1.more和less命令查看大文本 2.head和tail命令查看小文本和日志 3.使用管道多次处理信息 4.find指令 二.more和less more命令和less命令常用来查看大文本&#xff0c;其中less可以使用上下键快速浏览文本 使用方式 more文件 …

若依ruoyi-vue部署在子域名下(做为子应用)

若依ruoyi-vue部署在子域名下&#xff08;做为子应用&#xff09; 特殊情况需要部署到子路径下&#xff08;做为子应用&#xff09; 文章目录 若依ruoyi-vue部署在子域名下&#xff08;做为子应用&#xff09;一、vue.config.js二、router/index.js三、Navbar.vue四、request.j…

通过查找真实IP bypass WAF

当已知某站存在漏洞时&#xff0c;Web 应用程序防火墙&#xff08;简称WAF&#xff09;是最大的阻碍。通常&#xff0c;这些网站都很老旧&#xff0c;维护得不是很好&#xff0c;因此在大多数情况下&#xff0c;将 WAF 放在它们之上会更容易。有一种方法可以绕过这一层保护&…

【软件文档】软件质量保证计划书(Word完整版)

1 概述 2 质量目标 3 项目基本情况 4 资源 4.1 人员 4.1.1 组织结构 4.1.2 职责 4.2 工具及设施 5 质量保证的主要工作 6 质量保证工作量估算 7 质量保证工作提交的产物 8 变更管理 9 评价标准 10 形成的记录 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;…

想了解前端开发神器MemFire Cloud,这一文就搞定

在如今这个快速变化的开发世界里&#xff0c;谁不想拥有一款能够极大提升效率的开发神器&#xff1f;如果你也是一个想在开发路上少走弯路的程序员&#xff0c;那你一定要了解一下 MemFire Cloud。这款专为“懒人开发者”准备的全能工具&#xff0c;凭借其便捷的操作和强大的功…

ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(5)

接前一篇文章:ESP32-C3在MQTT访问时出现“Last error code reported from esp-tls: 0x8001”和问题的分析(4) 前几篇文章分析了笔者在调试测试MQTT时所遇到的“Last error code reported from esp-tls: 0x8001”的问题。实际上笔者在实际测试时发现,还有另外一种错误情况,…

关于Claude Artifacts的5条总结!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

简道云进销存的设计分析

​简道云-进销存应用是对标标准ERP的核心场景业务流、功能&#xff0c;开发的一款拥有自定义能力的“专业进销存”场景应用产品。 01功能表 简道云-进销存应用&#xff0c;主要是实现进销存业务中的4大工作流程“采购、销售、库存、财务”的场景设计&#xff0c;对应的&#x…

手机删除的照片怎么恢复?被删照片不怕,教你4个恢复秘笈

手机不仅是我们的掌中宝&#xff0c;在手机相册里更是藏着无数秘密与珍贵的回忆。但你是否也遇到过这样的尴尬&#xff1a;一不小心的操作&#xff0c;那些记录生活点滴、定格美好瞬间的照片&#xff0c;就从眼前消失&#xff0c;只留下一串问号和一颗焦急的心。 在数字时代&a…

见合八方发布用于测风雷达的1550nm蝶形MOPA激光器

天津见合八方光电科技有限公司(以下简称“见合八方”)日前发布1550nm蝶形半导体MOPA激光器JMA-BT5515100。 产品介绍 MOPA激光器又称为主振荡功率放大器&#xff0c;MOPA广泛应用于分布式光纤传感、激光雷达等领域&#xff0c;其主体由两部分构成&#xff1a;半导体激光器光放…