如何调试 React-Virtualized 的 InfiniteScroll/Grid 抓取?
How Can I Debug React-Virtualized's InfiniteScroll/Grid Fetching?
我有一个 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.log
和 debugger
语句填充 React Virtualized 代码,我仍然无法弄清楚为什么会这样在 125 个结果处停止(或者为什么快速滚动重置)。
任何更熟悉 React Virtualized 的人都可以指出代码中它决定是继续获取还是停止(并可能将起始索引重置为 0)的位置?我可以看出涉及 InfiniteScroll 的 onRowsRendered
和 scanForUnloadedRanges
以及 Grid 的 onSectionRendered
,但我仍然无法弄清楚值处理在哪里停止以及实际的 "decide whether to keep going" 逻辑开始.
正如@brianvaughn 在他的评论中所建议的那样,InfinititeLoader
组件 (https://github.com/bvaughn/react-virtualized/blob/master/source/InfiniteLoader/InfiniteLoader.js) 负有部分责任。每当呈现行时,从 scanForUnloadedRanges
调用 _loadUnloadedRanges
方法,它会处理加载 scanForUnloadedRanges
找到的范围。
然而,这只是等式的一部分。传递给 onRowsRendered
的参数来自 Grid
。 Grid
_updateScrollTopForScrollToRow
方法在用户滚动时被调用,该方法具有以下行:
const targetIndex = Math.max(0, Math.min(rowCount - 1, scrollToRow))
targetIndex
最终会影响加载的行,如您所见,它取决于最初传入的 rowCount
。
这就是我遇到问题的原因。我从 InfiniteLoader
+ List
组合开始,在该设置中 "row" 对两个组件意味着相同的事情。然而,我随后切换到 InfiniteLoader
+ Grid
组合,并且切换到 Grid
一个 "row" 是一个 InfiniteLoader
行的数组。换句话说,Grid
"row" 是一行单元格,而 InfiniteLoader
"row" 是一个单元格。
我计算 rowCount
的方法已更改为使用 "row" 的 Grid
定义,但由于它被传递给 InfinniteLoader
我应该使用InfiniteLoader
对 "row" 的定义。换句话说,我应该只返回 numItems
,而不是 numItems/columnCount
。
如果 React Virtualized 使用 InfiniteLoader
的 "items" 道具而不是使用其他两个 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.log
和 debugger
语句填充 React Virtualized 代码,我仍然无法弄清楚为什么会这样在 125 个结果处停止(或者为什么快速滚动重置)。
任何更熟悉 React Virtualized 的人都可以指出代码中它决定是继续获取还是停止(并可能将起始索引重置为 0)的位置?我可以看出涉及 InfiniteScroll 的 onRowsRendered
和 scanForUnloadedRanges
以及 Grid 的 onSectionRendered
,但我仍然无法弄清楚值处理在哪里停止以及实际的 "decide whether to keep going" 逻辑开始.
正如@brianvaughn 在他的评论中所建议的那样,InfinititeLoader
组件 (https://github.com/bvaughn/react-virtualized/blob/master/source/InfiniteLoader/InfiniteLoader.js) 负有部分责任。每当呈现行时,从 scanForUnloadedRanges
调用 _loadUnloadedRanges
方法,它会处理加载 scanForUnloadedRanges
找到的范围。
然而,这只是等式的一部分。传递给 onRowsRendered
的参数来自 Grid
。 Grid
_updateScrollTopForScrollToRow
方法在用户滚动时被调用,该方法具有以下行:
const targetIndex = Math.max(0, Math.min(rowCount - 1, scrollToRow))
targetIndex
最终会影响加载的行,如您所见,它取决于最初传入的 rowCount
。
这就是我遇到问题的原因。我从 InfiniteLoader
+ List
组合开始,在该设置中 "row" 对两个组件意味着相同的事情。然而,我随后切换到 InfiniteLoader
+ Grid
组合,并且切换到 Grid
一个 "row" 是一个 InfiniteLoader
行的数组。换句话说,Grid
"row" 是一行单元格,而 InfiniteLoader
"row" 是一个单元格。
我计算 rowCount
的方法已更改为使用 "row" 的 Grid
定义,但由于它被传递给 InfinniteLoader
我应该使用InfiniteLoader
对 "row" 的定义。换句话说,我应该只返回 numItems
,而不是 numItems/columnCount
。
如果 React Virtualized 使用 InfiniteLoader
的 "items" 道具而不是使用其他两个 React Virtualized 组件也使用的名称(具有两种不同的含义),那么所有这一切都可以轻松避免...但至少现在我对这些组件的工作原理有了 很多 的更好理解。