【问题标题】:What is the difference between reg-event-db, reg-event-fx and reg-event-ctx in Re-frame?Re-frame 中的 reg-event-db、reg-event-fx 和 reg-event-ctx 有什么区别?
【发布时间】:2019-02-25 10:30:49
【问题描述】:
Re-frame 中有 3 个事件 fns,我可以对 reg-event-db 和 reg-event-fx 做同样的事情。
reg-event-db、reg-event-fx 和 reg-event-ctx 的主要区别是什么?
我什么时候应该使用reg-event-fx 而不是reg-event-db,反之亦然。
【问题讨论】:
标签:
clojure
clojurescript
reagent
re-frame
【解决方案1】:
简短回答:它们代表注册事件处理程序的三个抽象级别。
reg-event-db 是reg-event-fx 的一个更专注、更有限的版本。当您的处理程序只关心db 值时,reg-event-db 是最方便使用的;您可以使用reg-event-fx 编写相同的处理程序,但您必须从处理程序的输入中获取:db 值。这是注册事件处理程序的最常见情况。
如果您的处理程序需要访问共同效果/产生效果,那么您将使用reg-event-fx 并从处理程序的输入中获取:coeffects 值(以及:db,如果需要)。一个常见的用例是当您需要访问浏览器存储(例如 cookie、本地存储)但希望您的处理程序没有副作用时。文档中有一个example。
reg-event-ctx 是一种更低级别的事件处理程序,它接收整个context,但这很少是您想要用来注册事件处理程序的。来自文档:This form of registration is almost never used.
这是一个示例上下文映射:
{:coeffects {:event [:some-id :some-param]
:db <original contents of app-db>}
:effects {:db <new value for app-db>
:dispatch [:an-event-id :param1]}
:queue <a collection of further interceptors>
:stack <a collection of interceptors already walked>}
-
reg-event-db 处理程序仅被赋予:coeffects -> :db 值,并且它们的返回值通知:effects -> :db
-
reg-event-fx 处理程序被赋予整个 :coeffects 值,它们的返回值通知 :effects
-
reg-event-ctx 处理程序被传递(并返回)整个上下文映射