0Pricing
React Academy · 课时

结合虚拟化与数据获取

当虚拟化列表到达末尾时触发数据获取,实现无限滚动。

结合虚拟化与数据获取 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

无限滚动模式

无限滚动会在用户接近列表末尾时加载更多数据,而不是通过明确的分页按钮进行分页。结合虚拟化后,您可以流畅地浏览超大型数据集。

列表只显示可见的行,同时在用户到达底部之前不久于后台获取新数据。

onItemsRendered 回调

react-window 列表组件接受一个 onItemsRendered 回调,用于报告当前正在渲染的项索引。它会提供可见区域以及预渲染区域的起始和结束索引。

这个回调是连接滚动行为的入口,让您无需绑定原始滚动事件,就能检测用户已经滚动过列表的多少内容。

检测接近 itemCount 的 overscanStopIndex

要知道何时获取数据,请将 onItemsRendered 提供的 overscanStopIndex 与当前的 itemCount 进行比较。当渲染窗口接近已加载数据的末尾时,就需要加载更多内容。

使用预渲染区域的结束索引可以提前留出一点时间,在用户真正到达最后一行之前稍早触发获取操作。

在末尾附近触发获取

当结束索引越过某个阈值时,例如距离 itemCount 只剩一屏内容,您就可以调用获取下一页的函数。请为它添加保护,避免触发多个重叠请求。

加载标志或检查获取操作是否已经在进行,可以防止用户滚过触发区域时产生重复请求。

将加载指示器作为最后一项

一个简洁的技巧是:只要还存在更多数据,就将 itemCount 设置为已加载数量加一。额外的行会渲染一个加载指示器,表示正在获取数据。

新数据到达后,数量会增加,加载指示器行也会被真实内容替代,从而提供流畅的视觉反馈。

react-window-infinite-loader

配套的 react-window-infinite-loader 程序包会为您封装这套逻辑。您提供 isItemLoaded、loadMoreItems 和 itemCount,它就会在用户滚向尚未加载的行时调用您的加载器。

它会处理已加载范围的记录管理,并防止重复调用加载函数,从而简化可靠的无限滚动实现。

获取数据时显示占位行

对于尚未加载的索引,您可以渲染占位行或骨架行,而不是显示空白。渲染函数会检查某个索引处的项是否已加载;如果没有,就显示骨架行。

骨架行可以保持布局并传达加载进度;在下一页数据即将到来时,这比显示空白区域更令人满意。

错误行和重试行

获取操作可能失败,因此请妥善处理错误。您可以在末尾渲染一个特殊的错误行,并添加一个重试按钮,让它重新调用失败范围的加载函数。

这样即使出现短暂故障,列表仍然可用,并且用户可以通过明确的方式恢复,而无需重新加载整个页面。

游标分页与偏移分页

有两种常见的分页方式可以为无限列表提供数据。偏移分页按页码或跳过数量发起请求,而游标分页则请求位于不透明游标之后的项;该游标指向最近看到的项。

对于实时变化的数据,游标分页通常更可靠,因为当插入新项时,它可以避免偏移量可能导致的项移动和重复。

结合 React Query 的 useInfiniteQuery

React Query 的 useInfiniteQuery 与虚拟化十分契合。它负责管理已获取的页面、下一个游标以及加载和错误状态,而 react-window 则高效地渲染展平后的页面。

您可以将各个页面展平为列表使用的单个数组,并在 onItemsRendered 达到阈值时调用 fetchNextPage,从而开箱即用地获得缓存和重试功能。

快速检查:无限滚动的触发条件

请确定在虚拟化的无限列表中何时获取更多数据。

回顾:结合数据获取的虚拟化

无限滚动会在用户接近末尾时加载页面。onItemsRendered 会报告索引,将 overscanStopIndex 与 itemCount 进行比较,就能判断何时获取数据,同时还要防止重复请求。

请使用占位行和错误行,使用 react-window-infinite-loader 管理已加载范围,并对实时数据采用游标分页。React Query 的 useInfiniteQuery 会与 react-window 的渲染配合,管理页面、游标和各种状态。

常见问题解答

「结合虚拟化与数据获取」课时是免费的吗?

是的 — 「结合虚拟化与数据获取」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「结合虚拟化与数据获取」这节课中我会学到什么?

当虚拟化列表到达末尾时触发数据获取,实现无限滚动。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「结合虚拟化与数据获取」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 大型列表渲染问题
  2. FixedSizeList:渲染数千个项目
  3. VariableSizeList:动态行高
  4. 结合虚拟化与数据获取
← 返回 React Academy