在Re-frame中,reg-event-db、reg-event-fx和reg-event-ctx有何区别?

12

Re-frame中有3个事件函数,我可以使用reg-event-dbreg-event-fx来完成同样的事情。

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

在什么情况下应该使用reg-event-fx而不是使用reg-event-db或者反过来?

1个回答

21
简短回答:它们代表了注册事件处理程序的三个抽象级别。 reg-event-dbreg-event-fx的更专注、更有限的版本。当您的处理程序只关心db值时,使用reg-event-db最方便;您可以使用reg-event-fx编写相同的处理程序,但必须从处理程序的输入中获取:db值。这是注册事件处理程序的最常见情况。
如果您的处理程序需要访问共同效应/产生效应,则应使用reg-event-fx并从处理程序的输入中获取:coeffects值(如有必要,还需获取:db)。常见用例是在需要访问浏览器存储(例如cookies、本地存储)但希望保持处理程序无副作用时。文档提供了一个examplereg-event-ctx是一种更低级别的事件处理程序类型,它接收整个context,但这几乎不是您想要用于注册事件处理程序的情况。从文档中可以看到:这种形式的注册几乎从不使用。 这是一个上下文映射示例:
{: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处理程序传递(并返回)此整个上下文映射

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接