html渲染成千上万的dom会导致浏览器卡顿乃至卡死,虚拟滚动就是解决方案之一页面只需要渲染可视区域的dom,当用户进行滚动时根据滚动高度进行可视区域dom的更新,从而达到无感滚动效
html渲染成千上万的dom会导致浏览器卡顿乃至卡死,虚拟滚动就是解决方案之一
页面只需要渲染可视区域的dom,当用户进行滚动时根据滚动高度进行可视区域dom的更新,从而达到无感滚动效果
思路:
代码量其实还是很少的,重点是理解思路
<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
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0