我之前的文章有写到这个问题,这篇文章再次优化一下,思维转换一下可能更加简单
问题: antdv的table组件不分页,要求展示上万条数据,还需要切换标签页,造成卡顿
解决办法: 找到table组件,绑定事件:
document.querySelector('#test table').addEventListener('scroll',() => {
this.handleScroll('#test table', 'data', 'datascroll', 'count')
}) // 给dom元素绑定scroll
写handleScroll函数:参数分别为dom元素的class或id,需要渲染的总数据,table组件展示的数据,上滑下滑到哪了第几次计数分别计数
handleScroll (idvalue, data, datascroll, count) {
this.scrollTop = document.querySelector(idvalue).scrollTop
this.offsetHeight = document.querySelector(idvalue).offsetHeight
this.scrollHeight = document.querySelector(idvalue).scrollHeight
/// 不足20条数据,就都展示了就好
if (this[data].length < this.numberMix) {
this[datascroll] = this[data]
// 滑到顶部也是给个提示
if (this.scrollTop === 0) {
this.$message.warn('您已经滑到顶部了')
}
// 滑到底部还是给个提示
if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) {
this.$message.warn('没有更多数据了')
}
return
}
// 滑到顶部scrollTop为0
if (this.scrollTop === 0) {
this.selectedRowKeys = []
// 计数变为1,即如果是1就代表滑到顶部了,取0-numberMax条数在可视区域
if (this[count] <= 0) {
this[count] = 1
}
if (this[count] === 1) {
this[datascroll] = this[data].slice(0, this.numberMax)
this.$message.warn('您已经滑到顶部了')
} else {
// 如果不是在顶部
document.querySelector(idvalue).scrollTo(0, 10)
this[datascroll] = this[data].slice(((this[count] - 2) * this.scrollnum), ((this[count] - 2) * this.scrollnum + this.numberMax))
this[count]--
}
}
// 滑到底部
if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) {
this.selectedRowKeys = []
// 是否是最后一次了
if ((this[count] * this.scrollnum + this.numberMax) >= this[data].length) {
this[datascroll] = this[data].slice((this[data].length - this.numberMax), this[data].length)
this.$message.warn('没有更多数据了')
return
}
document.querySelector(idvalue).scrollTo(0, 100)
this[datascroll] = this[data].slice((this[count] * this.scrollnum), (this[count] * this.scrollnum + this.numberMax))
this[count]++
}
}
小结:
0-20
4-24
8-28
12-32
…
附加数据说明:
scrollTop: 0, // 滚动条滚动高度
scrollHeight: 0, // 滚动条总高度
offsetHeight: 0, // 可视窗口高度
numberMax: 20, // 可视区域加载多少条
scrollnum: 4, // 每一次上滑或下滑滑出多少条
numberMix: 20, // 小于多少条就直接展示,不再走下滑计算的流程