10

Re-frame中有3 个事件 fns,我可以对和做同样的事情。reg-event-dbreg-event-fx

和之间reg-event-db的主要区别是什么?reg-event-fxreg-event-ctx

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

4

1 回答 1

16

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

reg-event-dbreg-event-fx. 当您的处理程序只关心db值时,reg-event-db使用起来最方便;您可以编写相同的处理程序,reg-event-fx但您必须:db从处理程序的输入中获取值。这是注册事件处理程序的最常见情况。

如果您的处理程序需要访问共同效果/产生效果,那么您将使用并从处理程序的输入中reg-event-fx获取:coeffects值(如果需要)。:db一个常见的用例是当您需要访问浏览器存储(例如 cookie、本地存储)但希望您的处理程序没有副作用时。文档有一个例子

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处理程序被传递(并返回)整个上下文映射
于 2019-02-25T11:13:43.567 回答