vue实现虚拟滚动渲染成千上万条数据

 更新时间:2023年02月10日 09:25:24   作者:永远不会太晚  
本文主要介绍了vue实现虚拟滚动渲染成千上万条数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

html渲染成千上万的dom会导致浏览器卡顿乃至卡死,虚拟滚动就是解决方案之一
页面只需要渲染可视区域的dom,当用户进行滚动时根据滚动高度进行可视区域dom的更新,从而达到无感滚动效果

思路:

  • 根据数据条数计算相应高度,使用dom占位,从而生成相应高度滚动列表,用户可以自由滚动
  • 监听滚动列表的scroll事件
  • 根据scrollTop进行slice数组,取出相应下标数据
  • 根据scrollTop值控制虚拟列表偏移,使其始终在用户可视区域内
  • 上下需要预留一些dom,避免用户滚动过快出现白屏
  • 使用fixed,absolute,transform避免页面回流

代码量其实还是很少的,重点是理解思路

<template>
  <div class="device">
    <div class="vir-scroll">
      <div class="scroll-Y" @scroll="scroll">
        <div class="parentDom">
          <!-- 占位,根据数据条数生成滚动列表 -->
          <div :style="{ height: screenHeight + 'px' }"></div>
           <!-- 虚拟滚动列表 -->
          <div class="positionRelative" :style="{ transform: getTransform }">
            <div class="scroll-item" v-for="item in visibleData" :key="item.index">
              <div class="scroll-info">helloworld</div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      /** 数据列表 */
      dataList: [],
      /** 单行高度 */
      itemHeight: 143,
      /** 偏移高度 */
      startOffset: 0,
      /** 起始显示数据 */
      start: 0,
      /** 结束显示数据 */
      end: 10,
    }
  },
  computed: {
    /** 根据每条数据的高度获取总列表高度 */
    screenHeight() {
      return this.dataList.length * this.itemHeight
    },
    /** 前面预留 */
    prevCount() {
      return 8
    },
    /** 后面预留 */
    nextCount() {
      return 25
    },
    /** 每次截取虚拟列表的位置 */
    getTransform() {
      return `translate(0,${this.startOffset}px)`
    },
    /** 虚拟数据 */
    visibleData() {
      return this.dataList.slice(this.start, Math.min(this.end, this.dataList.length))
    },
  },
  methods: {
    /** 列表滚动,暂时不节流,因为滚动快触发次数就少,容易导致没有及时更新数组导致白屏 */
    scroll(e) {
      this.scrollThrottle(e.target.scrollTop)
    },
    /** 滚动函数 */
    scrollThrottle(scrollTop) {
      const topCount = Math.floor(scrollTop / this.itemHeight) - this.prevCount
      // 此时的开始索引
      this.start = topCount >= 0 ? topCount : 0
      // 此时的结束索引
      this.end = this.start + this.nextCount
      // 此时的偏移量
      this.startOffset = this.start * this.itemHeight
    },
  },
}
</script>
<style scoped lang="scss">
.device {
  .vir-scroll {
    // 脱离文档流避免回流
    position: fixed;
    left: 0;
    width: 100%;
    height: calc(100% - 196px);
    padding: 0 16px;
    z-index: 10;

    .scroll-Y {
      width: 100%;
      height: 100%;
      overflow-y: auto;

      .parentDom {
        position: relative;

        .positionRelative {
          width: 100%;
          position: absolute;
          left: 0;
          top: 0;
          border-radius: 5px;
          padding-bottom: 12.5px;

          .scroll-item {
            height: 143px;
            background-color: #ffffff;
            font-size: 12px;
            padding: 10px 15px 0px 15px;
          }
        }
      }
    }
  }
}
</style>

到此这篇关于vue实现虚拟滚动渲染成千上万条数据的文章就介绍到这了,更多相关vue 虚拟滚动渲染内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现方法

    前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现方法

    token是一个用户信息的表示,在登录中将会从后端拿到token,然后用户才可以进行往后的一系列操作,这篇文章主要给大家介绍了关于前端登录退出处理Token问题(获取、缓存、失效处理)及代码实现的相关资料,需要的朋友可以参考下
    2024-01-01
  • Vue.extend 登录注册模态框的实现

    Vue.extend 登录注册模态框的实现

    这篇文章主要介绍了Vue.extend 登录注册模态框的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Vue3的setup在el-tab中动态加载组件的方法

    Vue3的setup在el-tab中动态加载组件的方法

    公司某项目需求在页面显示的组件是根据角色变化而变化的,怎么实现这个效果呢,下面小编给大家介绍下Vue3的setup在el-tab中动态加载组件的方法,需要的朋友可以参考下
    2022-11-11
  • vue 解决provide和inject响应的问题

    vue 解决provide和inject响应的问题

    这篇文章主要介绍了vue 解决provide和inject响应的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue3中使用logicFlow的方法代码示例

    vue3中使用logicFlow的方法代码示例

    在Vue3环境下,使用LogicFlow可实现流程图的绘制,详细步骤包括引入LogicFlow库,注册节点与边,设置主题和渲染数据,还包括使用Map和Menu进行功能扩展和右键编辑,以及通过事件监听实现交互,
    2024-10-10
  • 前端vue中实现文件下载的几种方法总结

    前端vue中实现文件下载的几种方法总结

    这篇文章主要介绍了前端vue中实现文件下载的几种方法总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue实现tagsview多页签导航功能的示例代码

    vue实现tagsview多页签导航功能的示例代码

    这篇文章主要介绍了vue实现tagsview多页签导航功能,本文梳理了一下vue-element-admin项目实现多页签功能的整体步骤,需要的朋友可以参考下
    2022-08-08
  • Vue 获取数组键名的方法

    Vue 获取数组键名的方法

    本篇文章主要介绍了Vue 获取数组键名的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Vue渲染器设计实现流程详细讲解

    Vue渲染器设计实现流程详细讲解

    在浏览器平台上,用它来渲染其中的真实DOM元素。渲染器不仅能够渲染真实的DOM元素,它还是框架跨平台能力的关键。所以在设计渲染器的时候一定要考虑好自定义的能力
    2023-01-01
  • vue部署到线上为啥会出现404的原因分析及解决

    vue部署到线上为啥会出现404的原因分析及解决

    这篇文章主要介绍了vue部署到线上为啥会出现404的原因分析及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论