虚拟滚动列表高度计算不准怎么办?
我在用 React 实现虚拟滚动时,发现列表项高度不一致,用了 react-window 的 VariableSizeList,但滚动过程中经常出现空白或内容错位。是不是我哪里没设置对?
我试过在 itemSize 里返回固定值没问题,但动态高度就乱了。比如下面这样:
const itemSize = (index) => {
return contentHeights[index] || 60; // contentHeights 是提前计算好的高度数组
}
但有时候 contentHeights 还没更新完,列表就渲染了,导致高度为 60,后面内容就错位了……有没有靠谱的处理方式?
resetAfterIndex方法来修正高度缓存。你的情况是典型的高度缓存没及时更新导致的。试试这样改:
1. 先确保
contentHeights是可靠数据源,最好在数据变化时重新计算2. 给VariableSizeList加个ref,在数据更新后调用
resetAfterIndex(0)强制重置缓存3. 建议加上
estimatedItemSize属性,给个平均值减少初始渲染抖动代码大概长这样:
我上次项目也踩过这个坑,折腾半天才发现文档里其实写了。虚拟滚动这种性能敏感的东西,缓存策略确实得严格点,不然分分钟给你表演错位消失术。
resetAfterIndex通知它重新计算布局。我之前是写个useEffect监听高度数组,只要变动了就重置一下,像下面这样: