Vue如何渲染十万行数据(虚拟长列表)

Vue如何渲染十万行数据?

思路

使用虚拟长列表方法,具体来说,首先就是设置列表容器高度,然后通过列表容器的滚动事件,获取用户滚动距离,根据滚动距离和每行的高度计算出被滚出可视区域的行数,然后删除这些被滚出可视区的DOM,同时新增需要展现的DOM。并且删除滚出可视区的DOM之后,设置列表容器的上padding,来填充删除DOM留下的空缺,保证可视区域的DOM节点视觉上没有发生位置变动。

代码
<template>
    <div class="container" @scroll="onScroll">
        <div class="panel" ref="panel" :style="{paddingTop:paddingTop+'px'}">
           <div class="item" v-for="item in visibleList" :key="item">
              {{item}}
           </div>
        </div>
    </div>
</template>
<script>
import { onMounted,ref,computed } from 'vue';

   export default{
    setup(props){
       let panel=ref(null) //列表容器DOM
       //构造的长列表原始数据
       let raw=Array(100000).fill(0).map((v,i)=>`item-${i}`);
       let count=10; //实际渲染DOM的列表数量
       let start=ref(0);//从长列表数组总截取数据的起点
       let end=ref(10);//从长列表数组总截取数据的终点
       let itemHeight=30;//单个列表项的高度
       let paddingTop=ref(0);//列表容器的上内边距
       let totalHeight=raw.length*itemHeight //原始数据理论上完全渲染后占据的总高度
       let visibleList=computed(()=>raw.slice(start.value,end.value));//根据起点和终点获取要渲染的数据
       onMounted(()=>panel.value.style.height=totalHeight+'px');//在mounted后设置列表容器的高度
       const onScroll=function(e){
          start.value=Math.floor(e.target.scrollTop/itemHeight);//当滚动后,根据滚动距离与单位列表项高度重新计算起点的位置
          end.value=start.value+count;//设置终点的位置
          paddingTop.value=start.value*itemHeight;//设置列表容器上内边距,来填充删除DOM留下的空缺

       };
       return {visibleList,paddingTop,panel,onScroll};
    }
   }
</script>
<style scoped>
   .container{
    height: 300px;
    overflow-y: scroll;
   }
   .item{
    border: 1px solid #eee;
    line-height: 30px;
    height: 30px;
    width: 300px;
    padding:  0 10px;
    cursor: pointer;
   }
</style>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值