Vxe UI vue vxe-table 分享无限滚动行方式
实现无限滚动加载有多种方式,可以使用 scroll 事件,也可以使用 scroll-boundary 事件,能满足不同的需求场景。
以下是分享使用 scroll-boundary 事件的用法。
原理
通过 scrollY.threshold 设置阈值的大小,当滚动距离达到范围之内时,会触发 scroll-boundary 事件,通过滚动事件就可以请求后台接口,加载下一页的数据,来实现无限滚动。
需要注意设置好loading,避免在这个指定的距离内反复滚动,多次触发,使用loading就可以避免这个问题,必须等 loading 结束后,才能请求下一次数据,这样就能实现又能同时兼容大量数据,又能同时支持分页,又能让用户看不到分页。
代码
比如设置 threshold=30,当滚动距离底部 30px 内时就触发加载。
<template>
<div>
<vxe-grid v-bind="gridOptions" @scroll-boundary="scrollBoundaryEvent"></vxe-grid>
</div>
</template>
<script>
export default {
data () {
const gridOptions = {
border: true,
loading: false,
showOverflow: true,
showHeaderOverflow: true,
showFooterOverflow: true,
height: 600,
columnConfig: {
resizable: true
},
scrollY: {
enabled: true,
gt: 0,
threshold: 30
},
columns: [
{ type: 'seq', width: 80 },
{ field: 'id', title: 'ID', width: 120 },
{ field: 'name', title: 'Name' },
{ field: 'role', title: 'Role' },
{ field: 'sex', title: 'Sex', width: 100 }
],
data: []
}
return {
gridOptions,
rowKey: 0
}
},
methods: {
// 模拟行数据
loadList (size = 200) {
if (this.gridOptions.loading) {
return
}
// 模拟后端接口
this.gridOptions.loading = true
setTimeout(() => {
const dataList = []
for (let i = 0; i < size; i++) {
this.rowKey++
dataList.push({
id: `${this.rowKey}`,
name: 'Test' + this.rowKey,
role: 'Developer' + this.rowKey,
sex: '男'
})
}
this.gridOptions.data = [...this.gridOptions.data, ...dataList]
this.gridOptions.loading = false
}, 300)
},
scrollBoundaryEvent ({ direction }) {
switch (direction) {
case 'top':
console.log('触发顶部阈值范围')
break
case 'bottom':
console.log('触发底部阈值范围')
this.loadList(20)
break
case 'left':
console.log('触发左侧阈值范围')
break
case 'right':
console.log('触发右侧阈值范围')
break
}
}
},
created () {
this.loadList(20)
}
}
</script>
github https://github.com/x-extends/vxe-table
gitee