跳到正文

虚拟列表

Virtual List

高级通用

虚拟列表(Virtual List)是一种长列表渲染方式:页面只创建可见区域及附近的列表项,滚动时再替换它们。这样能减少同时存在的页面元素,缓解消息记录、后台数据列表等场景中的滚动卡顿。

你可能会说:「这个消息列表越长越卡,能不能只显示屏幕附近的内容,滚动时再接上?」

读之前建议先了解(这是一个高级概念)

动手看看

访问记录
共 1,000 条
当前创建的列表项
约 12 项
1,000 项
当前位置:第 1–6 条
当前位置:第 501–506 条
当前位置:第 995–1,000 条
登录记录 1账号验证成功 · 刚刚
登录记录 2账号验证成功 · 刚刚
登录记录 3账号验证成功 · 刚刚
登录记录 4账号验证成功 · 刚刚
登录记录 5账号验证成功 · 刚刚
登录记录 6账号验证成功 · 刚刚
支付回调 1订单状态已同步 · 昨天
支付回调 2订单状态已同步 · 昨天
支付回调 3订单状态已同步 · 昨天
支付回调 4订单状态已同步 · 昨天
支付回调 5订单状态已同步 · 昨天
支付回调 6订单状态已同步 · 昨天
导出任务 1文件已生成 · 上周
导出任务 2文件已生成 · 上周
导出任务 3文件已生成 · 上周
导出任务 4文件已生成 · 上周
导出任务 5文件已生成 · 上周
导出任务 6文件已生成 · 上周
窗口外仅保留附近的缓冲项
窗口外的其余记录也已创建
渲染方式
滚动位置

切换渲染方式和滚动位置,再悬停看看记录。窗口里一次只看得到几条;关键区别是窗口外的记录有没有同时被创建。这里用少量示意行展示窗口,计数器表示真实千条列表中的创建数量。

虚拟列表只创建当前可见的记录和附近缓冲项。滚到别处时,窗口里的内容换了,但需要同时存在的列表项仍只有约 12 个。

要点

  1. 1

    只渲染看得见的那一段

    假设后台有上万条记录,你一次只能看到十几条。虚拟列表只为当前视口及附近的记录创建页面元素;滚动后,它会更新渲染范围,而不是让所有记录一直占着页面。

  2. 2

    用占位空间维持滚动位置

    虽然页面里只有一小段列表项,滚动条仍要反映整段内容的长度。实现时会为未渲染的部分保留空间。条目高度不固定时,还要处理高度测量,否则滚动位置可能跳动。

  3. 3

    交互不能跟着元素一起丢

    列表项移出渲染范围后,对应的页面元素可能被移除或复用。所以选中状态、输入内容等需要保存在稳定的数据状态里;如果支持键盘导航,也要检查焦点在滚动前后是否合理。

容易混淆的地方

虚拟列表解决的是「一次创建太多列表项」的问题,不等于分页:分页把内容分成几页,虚拟列表可以让用户在同一条滚动区域里浏览。它也不等于懒加载:懒加载决定何时获取数据或资源,虚拟列表决定哪些已获取的内容此刻要渲染。两者可以一起用。

什么时候用

适合用

  • 做客服工作台的长消息记录,用户需要连续滚动查看历史,但一次渲染全部消息会明显卡顿。
  • 做后台日志或订单列表,筛选后仍有大量结果,且用户需要在列表中持续滚动查找。

不适合用

  • 设置页只有十几项内容,完整渲染也很顺畅;直接用普通列表,能省去高度测量和焦点处理。
  • 用户需要按页核对并引用固定范围的财务记录;用分页更方便定位,也不必维持连续滚动。

练一练

你在做一个客服后台:消息记录很长,滚动时页面卡顿,产品希望用户仍能连续查看历史。你会先考虑哪种方案?

让 AI 帮你做

请把客服后台的消息记录改为虚拟列表:只渲染可视区域及附近的消息,保持连续滚动和正确的滚动位置。消息高度可能不同;请检查选中状态、键盘焦点,以及滚动到历史消息时的表现。

接下来学什么