<template>
<div>
<ul ref="list" class="list">
<li v-for="(item, index) in virtualList" :key="item.id" class="item">
{{ item.text }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
list: [], // 原始数据列表
virtualList: [], // 虚拟列表
startIndex: 0, // 可视区域内第一个列表项的索引
endIndex: 0, // 可视区域内最后一个列表项的索引
itemHeight: 50, // 列表项的高度
visibleCount: 5, // 可视区域内的列表项个数
};
},
mounted() {
// 初始化数据
this.initData();
// 监听滚动事件
this.$refs.list.addEventListener('scroll', this.handleScroll);
// 初始化虚拟列表
this.initVirtualList();
},
methods: {
initData() {
// 获取数据列表
// ...
},
initVirtualList() {
// 计算可视区域内的列表项索引范围
this.startIndex = 0;
this.endIndex = Math.min(this.startIndex + this.visibleCount - 1, this.list.length - 1);
// 截取可视区域内的列表项
this.virtualList = this.list.slice(this.startIndex, this.endIndex + 1);
},
handleScroll() {
// 计算滚动距离
const scrollTop = this.$refs.list.scrollTop;
// 计算可视区域内的列表项索引范围
this.startIndex = Math.floor(scrollTop / this.itemHeight);
this.endIndex = Math.min(this.startIndex + this.visibleCount - 1, this.list.length - 1);
// 截取可视区域内的列表项
this.virtualList = this.list.slice(this.startIndex, this.endIndex + 1);
},
},
};
</script>
<style>
.list {
height: 250px;
overflow-y: auto;
}
.item {
height: 50px;
line-height: 50px;
border-bottom: 1px solid #ccc;
text-align: center;
}
</style>
06-22
5017
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-30
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交