我有一个React Virtualized InfiniteList / Grid组合,遵循文档中的基本模式(https://github.com/bvaughn/react-virtualized/blob/master/docs/InfiniteLoader.md#infiniteloader-and-grid)。
除了两件事外,它很有效:
如果我滚动太快,而不是等待事情赶上,它会将滚动重置为网格顶部
组合只获取前N个结果(例如125)......即使我有859个结果(尽管我提供了859作为rowCount
道具)
我已经尽力了解发生了什么,甚至当我用console.log
和debugger
语句填充React虚拟化代码时,我仍然无法弄清楚为什么它停在125结果(或快速滚动重置的原因)。
任何更熟悉React Virtualized的人都能指出我在代码中的位置,它决定是继续提取还是停止(并可能将起始索引重置为0)?我可以告诉InfiniteScroll的onRowsRendered
和scanForUnloadedRanges
以及网格的onSectionRendered
,但我仍然无法弄清楚价值处理停止的位置以及实际的“决定是否继续”逻辑开始。
答案 0 :(得分:1)
正如@ brianvaughn在评论中所建议的,InfinititeLoader
组件(https://github.com/bvaughn/react-virtualized/blob/master/source/InfiniteLoader/InfiniteLoader.js)是部分责任。每当呈现行_loadUnloadedRanges
时,都会从scanForUnloadedRanges
调用方法,并且它会处理加载scanForUnloadedRanges
找到的范围。
然而,这只是等式的一部分。传递给onRowsRendered
的参数来自Grid
。在用户滚动时调用Grid
_updateScrollTopForScrollToRow
方法,该方法具有以下行:
const targetIndex = Math.max(0, Math.min(rowCount - 1, scrollToRow))
targetIndex
最终会影响哪些行被加载,正如您所看到的那样,它取决于最初传入的rowCount
。
这是给我带来麻烦的原因。我从一个InfiniteLoader
+ List
组合开始,在该设置中,“行”对两个组件都意味着相同的事情。然而,我接着转换为InfiniteLoader
+ Grid
组合,而Grid
“行”则是InfiniteLoader
行的数组。换句话说,Grid
“行”是一行单元格,但InfiniteLoader
“行”是一个单元格。
我计算rowCount
的方法已更改为使用“{”的“{1}}定义”,但由于它已传递给Grid
我应该使用InfinniteLoader
而是改为定义“行”。换句话说,我应该只返回InfiniteLoader
,而不是numItems
。
如果React Virtualized使用numItems/columnCount
的“items”支柱而不是使用另外两个React Virtualized组件使用的名称(具有两种不同的含义),则可以轻松避免所有这些......但是至少现在我对很多更好地了解这些组件的工作原理。