Ert*_*tin 4 clojure clojurescript reagent re-frame
有3个事件FNS在重制帧,我可以做两个同样的事情reg-event-db和reg-event-fx。
是什么之间的主要区别reg-event-db,reg-event-fx和reg-event-ctx?
什么时候应该使用reg-event-fxover reg-event-db,反之亦然。
简短的答案:它们代表注册事件处理程序的三个抽象级别。
reg-event-db是的更集中,有限的版本reg-event-fx。当您的处理程序只关心db值时,reg-event-db使用起来最方便;您可以使用编写相同的处理程序,reg-event-fx但必须:db从处理程序的输入中获取值。这是注册事件处理程序的最常见情况。
如果您的处理程序需要访问协同效果/产生效果,那么您将使用reg-event-fx并从处理程序的输入中获取:coeffects值(:db如果需要)。一个常见的用例是,当您需要访问浏览器存储(例如cookie,本地存储)但又希望使处理程序免受副作用时。该文档有一个例子。
reg-event-ctx是事件处理程序的一种甚至更底层的类型,它接收整个上下文,但这很少是您想要用来注册事件处理程序的东西。从文档: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>}
Run Code Online (Sandbox Code Playgroud)
reg-event-db仅给处理程序:coeffects -> :db赋值,它们的返回值通知:effects -> :dbreg-event-fx给处理程序整个:coeffects值,它们的返回值通知:effectsreg-event-ctx 处理程序被传递(并返回)整个上下文映射