当使用reagent和re-frame时,如何在CRUD类型的应用程序中实现撤销和重做功能?

3
尽管在 re-frame 主页上写着“保存和撤销变得非常容易”,但 re-frame 示例应用程序 'todomvc' 没有实现撤销/重做功能的代码。
当使用像 Java 这样的面向对象语言时,通常通过为执行的操作使用命令接口来实现撤销/重做,将其与它们的“反转”一起存储,并从存储的命令对象集合中(重新)执行这些命令。
虽然我已经阅读了 Clojure 等常见 OO 设计模式的页面(包括命令在此处),但在一些示例或应用程序中看到使用 reagent、re-frame 实现撤销/重做会很有帮助。
问:在使用 reagent 和 re-frame 时如何在 crud 类型的应用程序中实现撤销和重做?
2个回答

4

Re-frame实际上有一个内置的undoable中间件用于处理程序。不幸的是,(否则很棒的)文档根本没有涵盖它;我只有通过查看源代码才理解它的工作原理。

使用它非常容易:

(register-handler :your-handler
  ; this middleware from re-frame.core is all you need to enable undo
  (undoable "String that explains your action, optional")
  (fn [db [_]] ...))

这样做后,如果您想撤销操作,只需输入(dispatch [:undo])。要重新应用操作,请输入(dispatch [:redo])

中间件通过在每次调用之间简单保存变异版本的app-db来工作。默认的最大撤消深度为50。

有关更多信息,请阅读此文件此文件


1
以上内容稍加修正(几乎是吹毛求疵的级别)。正确的写法应该是 (dispatch [:undo])(dispatch [:redo]) - Mike Thompson
@MikeThompson:我认为这并不是吹毛求疵;感谢您指出语法错误!我已经相应地修正了我的答案。 - Thach Mai

3

其中一种方法是仅存储状态历史记录 - 这将是内存高效的,因为Clojure(Script)实际上会在幕后将其存储为更改历史记录。

请参见此链接以获取非常简短和清晰的示例!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接