vue虚拟列表展示
2023-12-25 16:45:30
<template>
<!-- 总体高度区域 -->
<div
ref="listWrap"
class="m-container"
@scroll="scrollListener"
>
<div
:style="handleContainerHeight()"
>
<!-- 可视区域 -->
<div
class="m-area"
:style="handleAreaStyle()"
>
<div
v-for="(item,index) in displayList"
:key="index"
:style="handleItemStyle()"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Options, Vue } from 'vue-class-component';
interface ListType {
label: string;
value: string;
}
@Options({
props: {
list: {
default:[],
},
},
})
export default class MList extends Vue {
list!: ListType[];
/** 每行高度 */
itemSize = 100;
/** 一次性展示多少个数据 */
showNum = 10;
/** 开始下标 */
start =0;
/** 结束下标 */
end = 10;
/** 滚动位置 */
scrollTop = 0;
get displayList() {
const arr = this.list.slice(this.start,this.end);
if(arr.length) {
return arr;
}
return [];
}
handleItemStyle() {
return {
height: `${this.itemSize}px`,
};
}
handleContainerHeight() {
return {
height: this.list.length * this.itemSize + 'px',
};
}
handleAreaStyle() {
return {
'transform': `translateY(${this.scrollTop}px)`,
};
}
scrollListener() {
this.scrollTop = (this.$refs.listWrap.scrollTop as number);
this.start = Math.floor(this.scrollTop/this.itemSize);
this.end = this.start + this.showNum;
}
}
</script>
<style scoped>
.m-container {
height: 100vh;
overflow: auto;
}
</style>
文章来源:https://blog.csdn.net/young_sam/article/details/135200766
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!