Re-frame中的reg-event-db,reg-event-fx和reg-event-ctx有什么区别?

Ert*_*tin 4 clojure clojurescript reagent re-frame

3个事件FNS重制帧,我可以做两个同样的事情reg-event-dbreg-event-fx

是什么之间的主要区别reg-event-dbreg-event-fxreg-event-ctx

什么时候应该使用reg-event-fxover reg-event-db,反之亦然。

Tay*_*ood 7

简短的答案:它们代表注册事件处理程序的三个抽象级别。

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 -> :db
  • reg-event-fx给处理程序整个:coeffects值,它们的返回值通知:effects
  • reg-event-ctx 处理程序被传递(并返回)整个上下文映射