返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue实现虚拟滚动渲染成千上万条数据
  • 456
分享到

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

vue虚拟滚动渲染vue滚动渲染 2023-02-10 12:02:31 456人浏览 薄情痞子
摘要

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

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 虚拟滚动渲染内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: vue实现虚拟滚动渲染成千上万条数据

本文链接: https://lsjlt.com/news/195471.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue实现虚拟滚动渲染成千上万条数据
    html渲染成千上万的dom会导致浏览器卡顿乃至卡死,虚拟滚动就是解决方案之一页面只需要渲染可视区域的dom,当用户进行滚动时根据滚动高度进行可视区域dom的更新,从而达到无感滚动效...
    99+
    2023-02-10
    vue 虚拟滚动渲染 vue 滚动渲染
  • DMap(谛听)—实战Vue百万条数据渲染表格组件开发
    DMap(谛听)是一个实战Vue百万条数据渲染表格组件开发项目。该项目旨在展示如何使用Vue开发高性能的表格组件,能够处理大量数据的...
    99+
    2023-09-20
    Vue
  • vue如何实现每次渲染完页面后div的滚动条保持在最底部
    这篇文章主要介绍vue如何实现每次渲染完页面后div的滚动条保持在最底部,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下://每次页面渲染完之后滚动条在最底部 updated:...
    99+
    2024-04-02
  • vue怎么实现滚动条加载更多数据
    这篇“vue怎么实现滚动条加载更多数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue怎么实现滚动条加载更多数据”文章吧...
    99+
    2023-07-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作