当前位置: 首页 > news >正文

前端高性能渲染 — 虚拟列表

虚拟列表,实际上就是在首屏加载的时候,只加载可视区域内需要的列表项,当滚动发生时,动态通过计算获得可视区域内的列表项,并将非可视区域内存在的列表项删除。该技术是解决渲染大量数据的一种解决方法。
实现虚拟列表,需要获取以下几个属性

  1. 可视区域起始数据索引(startIndex)
  2. 可视区域结束数据索引(endIndex)
  3. 计算可视区域数据,并渲染到页面中
  4. 计算startIndex对应的数据在整个列表中的偏移位置listTop并设置到列表上

高度固定

令App组件(父组件)产生一万条虚拟数据来模拟接口,在List组件中实现对应的功能

App组件:

<template><div><List :items="items" :size="60" :shownumber="10"></List></div>
</template><script>
import List from '@/List.vue'
export default {components: {List},computed: {// 模拟数据items() {return Array(10000).fill('').map((item, index) => ({id: index,content: index}))}}
};
</script><style scoped></style>

List组件:

<template><div class="container" :style="{ height: containerHeight }" @scroll="handleScroll" ref="container"><!-- 数据列表 --><div class="list" :style="{top:listTop}"><!-- 列表项 --><div v-for="item in showData" :key="item.id" :style="{height:size+'px'}">{{ item.content }}</div><!-- 用于撑开高度的元素 --><div class="bar" :style="{height:barHeight}"></div></div></div>
</template><script>
export default {name: 'List',props:{// 要渲染的数据items:{type:Array,required:true},// 每条数据渲染节点的高度size:{type:Number,required:true},// 每次渲染DOM节点个数shownumber:{type:Number,required:true}},data(){return{start:0,  //要展示数据的其实下标end:this.shownumber  //结束下标}},computed:{// 最终展示数据showData(){return this.items.slice(this.start,this.end)},// 容器的高度containerHeight(){return this.size * this.shownumber + 'px'},// 撑开容器内部高度的元素的高度barHeight(){return this.size * this.items.length + 'px'},// 列表项上滚动改变top的值listTop(){return this.start * this.size + 'px'},},methods:{// 容器滚动事件handleScroll(){// 获取容器顶部滚动的尺寸const scrollTop = this.$refs.container.scrollTopthis.start = Math.floor(scrollTop / this.size)this.end = this.start + this.shownumber}}
};
</script><style scoped>
.container{overflow-y: scroll;background-color: rgb(150,150,150,.5);font-size: 20px;font-weight: bold;line-height: 60px;width: 500px;margin: 0 auto;position: relative;text-align: center;
}
.list{position: absolute;top: 0;width: 100%;
}
</style>

这样可以实现一个简单的固定高度的虚拟列表功能。

http://www.lryc.cn/news/156493.html

相关文章:

  • 防水出色的骨传导耳机,更适合户外运动,南卡Runner Pro 4S体验
  • docker快速安装-docker一键安装脚本
  • 1584 - Circular Sequence (UVA)
  • Revit SDK:Selections 选择
  • K8s中的RBAC(Role-Based Access Control)
  • 肖sir__设计测试用例方法之经验测试方法09_(黑盒测试)
  • Python爬虫:下载小红书无水印图片、视频
  • 【小沐学Unity3d】3ds Max 多维子材质编辑(Multi/Sub-object)
  • # Go学习-Day8
  • Maven编译java及解决程序包org.apache.logging.log4j不存在问题
  • 【小吉测评】高效简洁的数据库管控平台—CloudQuery
  • 获取微信小程序二维码的bug
  • Linux之Shell(一)
  • 解决拦截器抛出异常处理类的500状态码Html默认格式响应 !
  • 搭建PyTorch神经网络进行气温预测
  • Qt Creato配置PCL库
  • 从阿里到字节跳动,这3年外包做完,我这人生算是彻底废了......
  • 在汽车行业中如何脱颖而出?使用聊天机器人是关键
  • Go语言最全面试题,拿offer全靠它,附带免积分下载pdf
  • 虚拟机Linux20.04磁盘扩展
  • 类欧几里得算法
  • c++读取和存储文件,对文件操作
  • InfluxDB API -- InfluxDB笔记四
  • 数据结构 - 单链表
  • 化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海
  • 4G版本云音响设置教程阿里云平台版本
  • STM32纯中断方式发送接收数据(串行通信;keil arm5;)
  • FPGA时序分析与约束(3)——时钟不确定性
  • 【Java-HDFS】使用Java操作HDFS获取HDFS指定目录下的数据量大小
  • 协议定制 + Json序列化反序列化