能帮我写一个vue3项目中通用的虚拟滚动吗
时间: 2024-03-15 22:43:51 浏览: 156
当然可以,以下是一个简单的虚拟滚动组件的示例代码:
```vue
<template>
<div class="virtual-scroll" ref="scrollWrapper" @scroll="handleScroll">
<div :style="{height: totalHeight + 'px'}"></div>
<div :style="{transform: 'translateY(' + offsetY + 'px)'}">
<div v-for="(item, index) in visibleList" :key="index" :style="{height: itemHeight + 'px'}">{{ item }}</div>
</div>
</div>
</template>
<script>
export default {
props: {
list: {
type: Array,
required: true
},
itemHeight: {
type: Number,
required: true
},
visibleCount: {
type: Number,
required: true
}
},
data() {
return {
totalHeight: 0,
offsetY: 0,
startIndex: 0,
endIndex: this.visibleCount - 1
};
},
computed: {
visibleList() {
return this.list.slice(this.startIndex, this.endIndex + 1);
}
},
mounted() {
this.totalHeight = this.list.length * this.itemHeight;
},
methods: {
handleScroll() {
const scrollTop = this.$refs.scrollWrapper.scrollTop;
const startIndex = Math.floor(scrollTop / this.itemHeight);
const endIndex = startIndex + this.visibleCount - 1;
this.startIndex = startIndex;
this.endIndex = endIndex;
this.offsetY = startIndex * this.itemHeight;
}
}
};
</script>
<style scoped>
.virtual-scroll {
overflow: auto;
position: relative;
}
.virtual-scroll > div:nth-child(1) {
position: absolute;
top: 0;
left: 0;
right: 0;
}
.virtual-scroll > div:nth-child(2) {
position: absolute;
top: 0;
left: 0;
right: 0;
}
</style>
```
这个组件接受三个props:
- list:要显示的数据列表
- itemHeight:每个数据项的高度
- visibleCount:可见的数据项数量
组件内部使用了一个滚动容器,容器中包含两个div,第一个div的高度等于所有数据项的高度之和,第二个div包含了所有可见的数据项,通过计算滚动容器的scrollTop和startIndex,可以确定当前应该显示哪些数据项。同时,为了避免在滚动时频繁更新DOM,我们使用了translateY来实现滚动效果,而不是设置每个数据项的top值。
阅读全文