Skip to content
目录

命令系统和 Undo/Redo

Univer 把一切可撤销的数据修改收敛为 MUTATION,由 CommandService 统一执行、记录栈、触发协同。


1. 三层类型回顾

类型Undo协同示例
MUTATIONSetRangeValuesMutation
COMMAND展开为多条 MUTATION视实现「粘贴」
OPERATION改选区、滚动

2. 执行流程

mermaid
sequenceDiagram
  participant UI
  participant CS as CommandService
  participant M as Model
  participant UR as UndoRedo
  UI->>CS: executeCommand / syncExecute
  CS->>CS: 权限/拦截器
  CS->>M: 应用 MUTATION
  CS->>UR: 入栈
  CS->>UI: 事件刷新渲染

3. Undo/Redo

  • 栈中存 MUTATION 序列(或逆操作)。
  • 批量executeCommand 包一层 transaction,一次 Undo 回滚整批。
  • Redo 为 Undo 的逆序列。

4. 拦截器

可在执行前后注入:权限校验、审计日志、协同过滤。
插件通过注册 Interceptor 扩展,无需改核心 CommandService。


5. 协同对齐

协同层只同步 MUTATION(+ 版本号),与本地 Undo 栈分离;远端 MUTATION 不应直接进入本地 Undo 栈(由协同服务合并策略处理)。


6. 实践

  • 自定义功能 = 定义 MUTATION +(可选)COMMAND handler。
  • 只读查询走 Service 读 Model,不要伪造 MUTATION。
  • UI 态用 OPERATION,避免污染快照。

7. 总结

改数据只走 Command 是 Univer 最重要约束;Undo 与协同都建立在此之上。

MIT License.