跳到正文

游标分页

Cursor Pagination

高级通用

游标分页(Cursor Pagination)是接口按固定顺序返回一批数据,并给出一个用于继续读取的游标。它解决列表不断新增数据时,按页码翻页容易重复或漏项的问题,比如继续加载消息记录。

你可能会说:「我想让消息列表一批批加载,新消息进来后继续往下翻,也别把刚看过的消息再显示一遍。」

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

动手看看

客服消息 · 每批 3 条
刚到的新消息
M106 · 小林:我补充了订单号
已拿到的首批 · 从新到旧
M105 · 阿青:正在核对付款记录
M104 · 小林:昨晚提交了工单
M103 · 阿青:收到,我来看看
接口返回游标:after=M103
下一页请求:offset=3
继续读取的结果
M102 · 小林:附件已上传
M103 · 阿青:收到,我来看看
M101 · 阿青:请发一下截图
M102 · 小林:附件已上传
M100 · 小林:页面提示支付失败
M101 · 阿青:请发一下截图
读取进度
翻页方式

先切换读取进度,看首批消息、插入新消息,再继续加载;也可以换一种翻页方式,对照下一批的内容。

游标记住首批最后的 M103。继续读取时从它后面接上 M102、M101、M100,新插入的 M106 不会挤乱这个衔接。

要点

  1. 1

    先确定一套稳定的排序规则

    假设你按消息发送时间倒序展示列表,两条消息可能同一时间发出,所以我们再用唯一 ID 排定先后。排序不唯一,接口就难以准确判断下一批从哪里接上。

  2. 2

    用返回的游标继续请求数据

    接口返回这一批消息时,也给你一个下一页游标。前端下次把它传回去,服务端就沿着同一排序规则继续查。游标可以封装位置等信息,前端只需保存和传回,不必解析。

  3. 3

    筛选变化后从头开始读取

    如果你从「全部消息」切到「未读消息」,旧游标对应的查询范围就变了。我们会清空旧列表和游标,重新请求第一批;接口也需要说明怎样判断已经没有下一批。

容易混淆的地方

它和页码分页都能分批取数据,但页码分页让你指定第几页,游标分页让你从上次的位置继续读。因此它适合向后加载,却不方便直接跳到第 20 页。这里的「游标」是请求下一批数据用的标记,不是屏幕上的鼠标指针。游标也不等于固定快照:已有数据若被删除或改动排序字段,仍可能影响翻页结果。

什么时候用

适合用

  • 你在做聊天记录或动态流,用户不断往下加载,而列表顶部还会有新内容进入。
  • 你在做订单后台的逐批浏览或导出,数据量大,用户主要关心接着读取,而不是跳到指定页。
  • 你在做 AI 工具的运行日志列表,日志持续产生,界面需要按确定顺序加载更早的记录。

不适合用

  • 你做的是几十条固定内容的设置列表,一次取回并展示就够了,不必增加分页接口。
  • 你的报表要求用户直接跳到指定页、看到明确页码,可优先考虑页码分页。
  • 你需要的是某一时刻绝不变化的完整数据集,例如结算报表;应先固定数据范围或生成快照,而不是只依赖游标分页。

练一练

你做一个按创建时间倒序排列的工单列表。用户看完第一批时,新工单不断产生;他点击「加载更多」后,不想重复看到旧工单。你会怎样设计接口?

让 AI 帮你做

请把工单列表接口改为游标分页:按创建时间倒序、唯一 ID 作同时间的排序补充;返回数据、下一页游标和是否还有更多。前端加载更多时传回游标,筛选条件变化时清空列表和游标,并补充翻页测试。

接下来学什么