如何调试React-Virtualized的InfiniteScroll / Grid Fetching?

时间:2017-02-11 00:06:18

标签: react-virtualized

我有一个React Virtualized InfiniteList / Grid组合,遵循文档中的基本模式(https://github.com/bvaughn/react-virtualized/blob/master/docs/InfiniteLoader.md#infiniteloader-and-grid)。

除了两件事外,它很有效:

  • 如果我滚动太快,而不是等待事情赶上,它会将滚动重置为网格顶部

  • 组合只获取前N个结果(例如125)......即使我有859个结果(尽管我提供了859作为rowCount道具)

    • 这一点特别奇怪,因为它以25的增量取出,所以这意味着前5次一切正常,然后6日莫名其妙地失败。

我已经尽力了解发生了什么,甚至当我用console.logdebugger语句填充React虚拟化代码时,我仍然无法弄清楚为什么它停在125结果(或快速滚动重置的原因)。

任何更熟悉React Virtualized的人都能指出我在代码中的位置,它决定是继续提取还是停止(并可能将起始索引重置为0)?我可以告诉InfiniteScroll的onRowsRenderedscanForUnloadedRanges以及网格的onSectionRendered,但我仍然无法弄清楚价值处理停止的位置以及实际的“决定是否继续”逻辑开始。

1 个答案:

答案 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组件使用的名称(具有两种不同的含义),则可以轻松避免所有这些......但是至少现在我对很多更好地了解这些组件的工作原理。