Vue 实现虚拟列表可以有效提高大数据量列表的性能,这里提供一个实现虚拟列表的方法:
步骤1:定义组件
首先定义一个列表组件,可以按照下面的代码块来实现:
<template>
<div class="list" ref="list">
<div v-for="(item, index) in visibleData" :key="index">
{{ item }}
</div>
</div>
</template>
<script>
export default {
props: {
data: {
type: Array,
required: true,
},
itemHeight: {
type: Number,
default: 40,
},
visibleCount: {
type: Number,
default: 10,
},
},
computed: {
totalCount() {
return this.data.length;
},
visibleData() {
const list = this.$refs.list;
const scrollTop = list.scrollTop;
const start = Math.floor(scrollTop / this.itemHeight);
const end = Math.min(start + this.visibleCount, this.totalCount);
list.style.paddingTop = `${start * this.itemHeight}px`;
list.style.paddingBottom = `${(this.totalCount - end) * this.itemHeight}px`;
return this.data.slice(start, end);
},
},
};
</script>
<style scoped>
.list {
overflow-y: auto;
position: relative;
height: 400px;
}
</style>
在这个组件的 props 中,我们定义了 data、itemHeight、visibleCount 三个参数用来控制列表的展示,分别表示数据源、列表项的高度与可见区域内的项数。其中 totalCount、visibleData 作为 computed 值来计算。
步骤2:使用虚拟滚动
接下来,我们需要使用虚拟滚动的技术来完成长列表的展示。可以使用 vue-virtual-scroller 或 vue-virtual-scroll-list 等第三方插件来实现,这里以 vue-virtual-scroll-list 为例。
安装 vue-virtual-scroll-list
:
npm install vue-virtual-scroll-list
在组件中导入 vue-virtual-scroll-list
并使用它:
<template>
<div class="list" ref="list">
<virtual-list
:size="itemHeight"
:remain="visibleCount"
:debounce="200"
:data-key="'value'"
:data-sources="data"
@scroll="onScroll"
@reach-end="onReachBottom"
>
<div slot-scope="{ item, index }">
{{ item }}
</div>
</virtual-list>
</div>
</template>
<script>
import VirtualList from "vue-virtual-scroll-list";
export default {
components: {
VirtualList,
},
props: {
data: {
type: Array,
required: true,
},
itemHeight: {
type: Number,
default: 40,
},
visibleCount: {
type: Number,
default: 10,
},
},
methods: {
onScroll() {
// your scroll function
},
onReachBottom() {
// your reach bottom function
},
},
};
</script>
注意我们在上面代码中仅使用了几个 vue-virtual-scroll-list
所提供的属性:
- size:每个列表项的高度
- remain:可见区域内的元素个数
- debounce:滚动节流时间
- data-key:数据源中每个元素的 key 值
- data-sources:数据源
- @scroll:滚动事件触发函数
- @reach-end:滚动到底部的响应函数
我们还需要实现 onScroll 和 onReachBottom 这两个函数来处理组件滚动和滑动到底部后的逻辑。
示例1:虚拟列表元素为图片
假设我们要展示的列表数据是若干张图片,以下是示例代码。前提是图片已经存放在本地或者服务器端。
<template>
<div class="list" ref="list">
<virtual-list
:size="itemHeight"
:remain="visibleCount"
:debounce="200"
:data-key="'url'"
:data-sources="data"
@scroll="onScroll"
@reach-end="onReachBottom"
>
<div slot-scope="{ item, index }">
<img :src="item.url" style="width: 100%;" />
</div>
</virtual-list>
</div>
</template>
<script>
import VirtualList from "vue-virtual-scroll-list";
export default {
components: {
VirtualList,
},
props: {
data: {
type: Array,
required: true,
},
itemHeight: {
type: Number,
default: 300,
},
visibleCount: {
type: Number,
default: 3,
},
},
methods: {
onScroll() {
// your scroll function
},
onReachBottom() {
// your reach bottom function
},
},
};
</script>
示例2:虚拟列表元素为表格
假设我们要展示的列表数据为表格,以下是示例代码。
<template>
<div class="list" ref="list">
<table>
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
<th>住址</th>
</tr>
</thead>
<virtual-list
:size="itemHeight"
:remain="visibleCount"
:debounce="200"
:data-key="'id'"
:data-sources="data"
@scroll="onScroll"
@reach-end="onReachBottom"
>
<tbody slot-scope="{ item, index }">
<tr>
<td>{{ item.id }}</td>
<td>{{ item.name }}</td>
<td>{{ item.gender }}</td>
<td>{{ item.age }}</td>
<td>{{ item.address }}</td>
</tr>
</tbody>
</virtual-list>
</table>
</div>
</template>
<script>
import VirtualList from "vue-virtual-scroll-list";
export default {
components: {
VirtualList,
},
props: {
data: {
type: Array,
required: true,
},
itemHeight: {
type: Number,
default: 40,
},
visibleCount: {
type: Number,
default: 10,
},
},
methods: {
onScroll() {
// your scroll function
},
onReachBottom() {
// your reach bottom function
},
},
};
</script>
以上就是使用 Vue 实现虚拟列表的完整攻略,希望对你有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用 Vue 实现一个虚拟列表的方法 - Python技术站