跳到主要内容

Undo/Redo 设计

概述​

Undo/Redo 功能基于 RxDBChange 变更记录实现,通过 inversePatch 和 patch 字段记录每次变更的逆向和正向操作,从而支持撤销和重做功能。

:::info 插件依赖 Undo/Redo 由 @aiao/rxdb-plugin-history 提供,不在 core 里——不装它,rxdb.versionManager 不存在。安装与用法见插件手册。 :::

:::info 开发状态 本功能已在 VersionManager 和 HistoryManager 中实现核心逻辑。 :::

核心原则​

本节描述 Undo/Redo 功能的 4 个核心设计原则,这些原则确保了功能的正确性、一致性和可预测性。

1. 时间边界限制​

只能撤销 RxDB 初始化之后的数据变更。

  • RxDB 初始化之前的历史数据无变更记录,无法追踪和还原
  • 系统记录 RxDB 初始化时间作为 undo/redo 操作的起始边界
  • 确保所有可撤销的操作都有完整的变更日志支持

2. 事务完整性​

事务中的所有操作必须作为一个整体进行 undo/redo。

  • 通过 transactionId 字段标识同一事务中的多个变更
  • 撤销时:必须同时撤销该事务中的所有变更,保持数据一致性
  • 重做时:必须按照原始顺序恢复所有变更,避免状态错乱

3. 状态标记机制​

通过 revertChangeId 和 revertChangedAt 两个字段追踪变更的撤销状态。

变更记录通过这两个字段的组合,可以清晰区分三种状态:

状态组合矩阵​

revertChangeIdrevertChangedAt状态说明是否生效
nullnull正常生效,从未被撤销✅ 生效
非 null非 null已撤销,当前未生效❌ 失效
null非 null已恢复,曾被撤销过✅ 生效

字段作用说明​

revertChangeId(撤销标记)

  • null:变更当前生效
  • 非 null:变更已被撤销,不生效
  • Undo 时设置为 当前序列值 + 1(预留序列号)
  • Redo 时清除为 null(恢复生效)

revertChangedAt(审计时间戳)

  • null:从未被撤销
  • 非 null:记录首次被撤销的时间
  • Undo 时设置,Redo 时保留(审计历史)
  • 通过此字段可查询所有曾被撤销的变更