虚拟滚动如何实现分批次数据拉取?配合后端接口实现万级数据渲染

轻枫大大_4367

轻枫大大_4367

2026-04-29

501人浏览

原创

虚拟滚动仅控制可视区域渲染,万级数据需滚动监听+节流+分页/游标接口配合;应提前预加载(如距底200px),用sentinel或scrollTop计算页码/offset;后端须服务端分页,推荐游标分页;前端需缓存、防抖、AbortController取消请求,并与react-window等库集成。

虚拟滚动如何实现分批次数据拉取?配合后端接口实现万级数据渲染

虚拟滚动本身不负责数据拉取,它只控制“当前可视区域渲染哪些项”。万级数据分批次加载,关键在于把滚动位置映射成页码或偏移量,再按需请求后端接口。核心是前端滚动监听 + 节流 + 分页/游标式接口配合。

滚动位置转为数据请求参数

不能等用户滚到底部才加载下一页(体验差、易漏数据),而应提前预加载。常见做法是监听 scroll 或使用 IntersectionObserver 监控“临近可视区底部”的占位元素(如 sentinel 元素):

  • 设定一个“提前加载距离”,比如距离底部 200px 就触发下一页请求
  • 根据当前 scrollTop + clientHeight 和容器总高度估算当前“逻辑页码”或 offset
  • 若用分页(page + size),则 page = Math.floor(visibleStartIndex / pageSize) + 1;若用游标(如 lastId),则记录上一批末尾 ID 作为下次起点

后端接口需支持精准分段查询

后端不能返回全量数据再前端切片,必须由服务端完成分页裁剪。推荐两种模式:

Gemini
Gemini

Gemini是一款由 Google 提供的个人 AI 助手和多模态生成式 AI 产品。

下载
  • 偏移量分页(Offset-based):适合数据量稳定、排序字段唯一且无频繁增删的场景。接口如 GET /api/items?offset=1000&limit=50。注意 MySQL 的 OFFSET 在万级偏移时性能下降明显,需配合覆盖索引或改用游标
  • 游标分页(Cursor-based):更高效可靠。前端传上一批最后一条的排序字段值(如 last_created_at 或 last_id),后端查 WHERE created_at > ? ORDER BY created_at LIMIT 50。避免跳过问题,也规避了 OFFSET 性能陷阱

前端状态管理与缓存策略

避免重复请求、白屏、错乱,需维护清晰的数据状态:

  • 用 Map 或数组缓存已加载的“数据块”,key 可为 page 或 cursor;未命中时显示骨架屏或 loading 占位
  • 滚动中快速来回时,可能触发多次请求,需加防抖/节流(如 150ms 内只发一次),并取消前序未完成的请求(用 AbortController)
  • 保持“逻辑列表长度”准确(如通过接口返回 total 或估算),用于计算滚动条高度和位置映射;total 不必实时精确,可初始加载时获取一次,后续增量更新

与虚拟滚动库(如 react-window、vue-virtual-scroller)集成要点

以 react-window 为例,它只渲染可见行,但需要你提供 itemCount 和 itemData:

  • itemCount 设为预估总数(如后端返回的 total),或设为 Infinity + 滚动到底部自动加载(需配合 onItemsRendered 回调)
  • itemData 应是合并后的数据源:已加载的数据块拼接 + 未加载位置用 placeholder 对象(如 { loading: true }),组件内据此决定渲染内容或骨架
  • 监听 onItemsRendered,当渲染范围靠近末尾(overscanStopIndex >= itemCount - 5),触发下一批加载

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2663

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6750

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6206

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2663

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5763

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6750

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6458

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

923

5

ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

3060

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM官方文档
LLVM官方文档

共0课时 | 0人学习