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

时间:2019-02-25 10:30:49

标签: clojure clojurescript reagent re-frame

重新构架中有 3个事件fns ,我可以同时使用combineLatestreg-event-db做同样的事情。

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

何时应该在reg-event-ctx上使用reg-event-fx,反之亦然。

1 个答案:

答案 0 :(得分:6)

简短的回答:它们代表了注册事件处理程序的三个抽象层次。

reg-event-dbreg-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处理程序将传递(并返回)整个上下文映射