【问题标题】:How Can I Debug React-Virtualized's InfiniteScroll/Grid Fetching?如何调试 React-Virtualized 的 InfiniteScroll/Grid Fetching?
【发布时间】:2017-06-29 11:11:27
【问题描述】:

我有一个 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 Virtualized 代码,我仍然无法弄清楚为什么它会停止在 125 个结果(或为什么快速滚动重置)。

任何更熟悉 React Virtualized 的人能指出我在代码中决定是继续获取​​还是停止(并可能将开始索引重置为 0)的位置?我可以看出涉及到 InfiniteScroll 的 onRowsRenderedscanForUnloadedRanges 和 Grid 的onSectionRendered,但我仍然无法弄清楚值处理在哪里停止以及实际的“决定是否继续”逻辑开始。

【问题讨论】:

  • 附上一个 Plnkr 并附上你正在做什么的例子。
  • 不幸的是,创建示例涉及的代码太多。但是,我并不是在寻找针对我的特定问题的解决方案,只是想了解 React-Virtualized 的工作原理(特别是它决定是继续获取​​还是停止的地方)。
  • 好吧,我可能是在说你已经知道的,但是,决定何时加载数据的组件是InfiniteLoader,这里是:github.com/bvaughn/react-virtualized/blob/master/source/…。它不是太大,所以也许值得通过源扫描。我还写了一个如何使用 InfiniteLoader 的方法指南:github.com/bvaughn/react-virtualized/blob/master/docs/… 和另一个示例:github.com/bvaughn/react-virtualized/blob/master/docs/…
  • "任何更熟悉 React Virtualized 的人可以指出我在代码中决定是继续获取​​还是停止的位置" 我想你正在寻找这个: github.com/bvaughn/react-virtualized/blob/…
  • 也许断开连接是因为您没有意识到您的应用程序应该跟踪已加载(和正在加载)的行? InfiniteLoader 本身没有状态。这在我上面发布的 2 个示例中得到了说明。

标签: react-virtualized


【解决方案1】:

正如@brianvaughn 在他的评论中所建议的,InfinititeLoader 组件 (https://github.com/bvaughn/react-virtualized/blob/master/source/InfiniteLoader/InfiniteLoader.js) 部分负责。每当呈现行时,_loadUnloadedRanges 方法就会从 scanForUnloadedRanges 调用,它会处理加载 scanForUnloadedRanges 找到的范围。

但是,这只是等式的一部分。传入onRowsRendered 的参数来自GridGrid _updateScrollTopForScrollToRow 方法在用户滚动时被调用,该方法具有以下行:

const targetIndex = Math.max(0, Math.min(rowCount - 1, scrollToRow))

targetIndex 最终会影响加载哪些行,如您所见,这取决于最初传入的 rowCount

这就是给我带来问题的原因。我从InfiniteLoader + List 组合开始,在该设置中,“行”对两个组件意味着相同的事情。但是,我随后切换到InfiniteLoader + Grid 组合,而Grid 的“行”是InfiniteLoader 行的数组。换句话说,Grid“行”是一行单元格,而InfiniteLoader“行”是一个单元格。

我计算rowCount 的方法已更改为使用“行”的Grid 定义,但由于它被传递给InfinniteLoader,我应该使用InfiniteLoader 的“行”定义“ 反而。换句话说,我应该只返回numItems,而不是numItems/columnCount

如果 React Virtualized 使用 InfiniteLoader 的“items”属性而不是使用其他两个 React Virtualized 组件也使用的名称(具有两种不同的含义),那么所有这些都可以轻松避免......但至少现在我对这些组件的工作原理有了很多更好的理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 2017-07-04
    • 2021-01-01
    • 2019-09-21
    • 1970-01-01
    • 2020-12-14
    • 2019-06-26
    • 2018-02-20
    相关资源
    最近更新 更多