Skip to content

记录过期或重复 ​

记录视图是某一时刻的业务投影。它可能因为异步更新、分页、筛选、重复 id 或组件双挂载而过期或重复。不要用位置或显示文本来修正,应该修正 id 与快照生命周期。

常见原因 ​

原因症状
记录 id 不稳定排序后动作作用到另一行
数组 key 使用索引删除后复用旧组件状态
双挂载同一记录出现两次或动作执行两次
异步刷新竞态旧响应覆盖新记录
快照过期Agent 使用已删除或已更新的记录
分页 / 虚拟列表只看到当前窗口,却以为拿到全部
多标签页两个页面各自维护不同状态

修复原则 ​

  1. 记录 id 来自业务主键,不从数组位置生成。
  2. 每次执行前重新检查目标记录;协议层对折叠动作验证可引用 id。
  3. 快照与变更绑定:导航、筛选、排序、分页或写入后刷新描述。
  4. 一个记录一个所有者:避免两个组件同时投影同一记录。
  5. 分页显式暴露总数与窗口,不能静默截断。
  6. 异步响应带版本或取消令牌,防止旧响应覆盖新状态。

重复执行 ​

如果用户看到一次操作产生两条记录:

  • 检查前端是否双挂载;
  • 检查模型是否调用了两次;
  • 检查传输是否重试了已执行请求;
  • 检查后端是否缺少幂等键;
  • 检查协议 request.id 是否被复用或被错误地当作业务幂等键。

防重放只防止同一会话 id 重放,不保证业务函数本身幂等。生产写入仍应使用数据库约束或幂等 token。

排查步骤 ​

  1. 在调试面板记录前后快照与 changed.records。
  2. 对比记录 id、数量和更新时间。
  3. 检查是否有两个页面实例或两个 Agent 同时操作。
  4. 用只读动作确认后端真实状态。
  5. 若页面与后端不一致,先修复同步,再允许写入。

验收 ​

  • 排序、筛选和删除后 id 仍指向同一业务对象;
  • 导航后旧记录不可调用;
  • 分页响应有总数与下一页;
  • 重试不会二次写入;
  • 多标签页的冲突有明确策略。

相关 ​

记录、行内动作与变更证据、长列表、滚动与视口外动作、上下文模型。