重新构架中有 3个事件fns ,我可以同时使用combineLatest
和reg-event-db
做同样的事情。
reg-event-fx
,reg-event-db
和reg-event-fx
之间的主要区别是什么?
何时应该在reg-event-ctx
上使用reg-event-fx
,反之亦然。
答案 0 :(得分:6)
简短的回答:它们代表了注册事件处理程序的三个抽象层次。
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
处理程序将传递(并返回)整个上下文映射