命令系统和 Undo/Redo
Univer 把一切可撤销的数据修改收敛为 MUTATION,由 CommandService 统一执行、记录栈、触发协同。
1. 三层类型回顾
| 类型 | Undo | 协同 | 示例 |
|---|---|---|---|
| MUTATION | ✓ | ✓ | SetRangeValuesMutation |
| 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 与协同都建立在此之上。