antdv的table因数据量过大导致的卡顿问题及解决

 更新时间:2023年11月17日 08:56:37   作者:苑某某  
这篇文章主要介绍了antdv的table因数据量过大导致的卡顿问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

遇到的问题

antdv的table表格使用时因数据量过大,造成标签页切换卡顿的问题

解决办法

绑定滚动事件,页面只显示在可视区域内的数据,没在可视区域内的数据不予展示,dom元素的scrollHeight和offsetHeight和scrollTop三个值的比较,判断是否滑到底部了或者顶部了,滑到底部或顶部之后,用scrollTo函数改变滚动条的位置,使其可以再次触发滑到顶部或底部,用计数count,下滚一下count++,上滚一下count–,用count来从原数据里slice哪20条数据展示

上代码

mounted () {
document.querySelector('#test table').addEventListener('scroll', this.handleScroll) // 给dom元素绑定scroll事件,可以在mounted的时候就给他绑定
},
methods: {
    handleScroll (e) {
      this.scrollTop = e.target.scrollTop
      this.offsetHeight = e.target.offsetHeight
      this.scrollHeight = e.target.scrollHeight
      // 不足20条数据,就都展示了就好
      if (this.data.length < 20) {
        this.dataScroll= this.data
        // 滑到顶部也是给个提示
        if (this.scrollTop === 0) {
          this.$message.warn('您已经滑到顶部了')
        }
        // 滑到底部还是给个提示
        if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) {
          this.$message.warn('没有更多数据了')
        }
        return
      }
       // 滑到顶部scrollTop为0
      if (this.scrollTop === 0) {
        this.selectedRowKeys = []
        // 计数变为1,即如果是1就代表滑到顶部了,取0-20条数的告警在可视区域
        let scrollCountTop = this.scrollCount
        if (this.scrollCount <= 0) {
          this.scrollCount = 1
        }
        if (this.scrollCount === 1) {
          this.datascroll= this.data.slice(0, this.numberMaxOverView)  // this.numberMaxOverView是要在这一页展示的数据条数
          this.$message.warn('您已经滑到顶部了')
        } else {
          // 如果不是在顶部,根据计数计算展示哪20条数据,同时上滑要将计数减一,将滑条改变位置为了触发下一次到顶部的计算
          document.querySelector('#test .test').scrollTo(0, 10)
          this.datascroll= this.data.slice(((this.numberMaxOverView * (scrollCountTop - 1) - this.cacheNum)), (this.numberMaxOverView * scrollCountTop))
          this.scrollCount--
        }
      }
            // 滑到底部
      if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) {
        this.selectedRowKeys = []
        // 如果是最后一次数据展示,计算需要展示的条数
        let scrollCount = this.scrollCount
        let isLastPage = this.numberMaxOverView - (this.data.length - this.scrollCount * (this.datascroll.length - this.cacheNum))
        let lastNum = this.scrollCount * (this.data.length - this.cacheNum) - isLastPage
        if (isLastPage >= 0) {
          this.datascroll= this.data.slice(lastNum - this.cacheNum, this.data.length)
          this.$message.warn('没有更多数据了')
        } else {
          // 如果不是最后一次,根据计数计算展示哪20条数据,同时下滑要将计数加一,将滑条改变位置为了触发下一次底部计算
          document.querySelector('#test.demo').scrollTo(0, 100)
          // 如果是第一次下滑计算缓存不能再是触顶的0,可以是计算缓存往上10条
          if ((this.numberMaxOverView * scrollCount - this.cacheNum) < 0) {
            this.datascroll= this.data.slice((this.numberMaxOverView - this.cacheNum), (this.numberMaxOverView * 2))
            this.scrollCount++
          } else {
            this.datascroll= this.data.slice((this.numberMaxOverView * scrollCount - this.cacheNum), (this.numberMaxOverView * (scrollCount + 1)))
            this.scrollCount++
          }
        }
      }
}

注意

addeventlistener没办法绑定上handlescroll事件,

原因目前碰到的有二:

  • 一是你queryselector的时候没找到元素,如果是组件的话去控制台看一下元素的class有没有绑正确,再不然就给个你要绑定的id,在它下边找一找,总之你的dom要绑对;
  • 二是你用的组件是否需要给定scrollxy的属性才能绑定scroll事件

可以参考antdv它的list滚动无限加载的思想,如果无需其他操作只是一个list的话也可以用虚拟滚动的组件实现vue-virtual-scroller

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mpvue小程序循环动画开启暂停的实现方法

    mpvue小程序循环动画开启暂停的实现方法

    这篇文章主要介绍了mpvue小程序循环动画开启暂停的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 使用vue3重构拼图游戏的实现示例

    使用vue3重构拼图游戏的实现示例

    这篇文章主要介绍了使用vue3重构拼图游戏的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • vue移动端监听滚动条高度的实现方法

    vue移动端监听滚动条高度的实现方法

    今天小编就为大家分享一篇vue移动端监听滚动条高度的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • vuex状态管理浅谈之mapState用法

    vuex状态管理浅谈之mapState用法

    当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,为了解决这个问题我们可以使用mapState辅助函数帮助我们生成计算属性,这篇文章主要给大家介绍了关于vuex状态管理之mapState用法的相关资料,需要的朋友可以参考下
    2023-12-12
  • 详解vue3中如何使用youtube-player

    详解vue3中如何使用youtube-player

    这篇文章主要为大家介绍了详解vue3中如何使用youtube-player示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • vue.js基于v-for实现批量渲染 Json数组对象列表数据示例

    vue.js基于v-for实现批量渲染 Json数组对象列表数据示例

    这篇文章主要介绍了vue.js基于v-for实现批量渲染 Json数组对象列表数据,结合实例形式分析了vue.js使用v-for遍历json格式数据渲染列表相关操作技巧,需要的朋友可以参考下
    2019-08-08
  • Nuxt引入vue-persistedstate以及踩坑记录

    Nuxt引入vue-persistedstate以及踩坑记录

    这篇文章主要介绍了Nuxt引入vue-persistedstate以及踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • vue3中如何使用vue-types

    vue3中如何使用vue-types

    vue-types 在 Vue 3 中的使用主要适用于希望进行更细致的 prop 验证的场景,尤其是在 JavaScript 项目中,这篇文章给大家介绍vue3中如何使用vue-types,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • 手把手教你用vue3开发一个打砖块小游戏

    手把手教你用vue3开发一个打砖块小游戏

    这篇文章主要给大家介绍了关于如何利用vue3开发一个打砖块小游戏的相关资料,通过一个小游戏实例可以快速了解vue3开发小游戏的流程,需要的朋友可以参考下
    2021-07-07
  • vue-cli+webpack项目 修改项目名称的方法

    vue-cli+webpack项目 修改项目名称的方法

    下面小编就为大家分享一篇vue-cli+webpack项目 修改项目名称的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02

最新评论