虚拟列表实现时,为什么滚动到底部后内容错位了?
在给项目加虚拟列表优化时,卡顿问题解决了但滚动到底部时,列表项突然错位了。我用的是基于高度计算的虚拟列表方案,滚动到接近底部时会自动加载新数据,但新加载的内容位置会突然跳到中间。
尝试过调整可视区域计算逻辑,但问题依旧。以下是核心代码片段:
function calculateVisibleRange() {
const scrollTop = this.listContainer.scrollTop;
const startIndex = Math.floor(scrollTop / ITEM_HEIGHT);
const endIndex = startIndex + VISIBLE_COUNT;
return { startIndex, endIndex };
}
handleScroll() {
this.updateVisibleItems();
if (this.listContainer.scrollTop + this.listContainer.clientHeight
> this.listContainer.scrollHeight - 200) {
this.loadMore();
}
}
加载新数据后调用了updateVisibleItems(),但发现列表项的位置偏移量不对,特别是当新数据加载后滚动条位置会突然跳动。是不是滚动位置计算有误?
scrollHeight变了,但滚动位置没及时调整。你得在加载完新数据后重新计算滚动位置。代码放这了:
关键是加载完数据后,要根据新的
scrollHeight重新算一下滚动位置,不然就会出现跳动或者错位。别问我为啥知道,因为我之前也踩过这个坑。