如何避免动作链

How to avoid action chains

我正在尝试了解 Flux 模式。

我相信在任何好的设计中,应用程序都应该由相对独立和通用(因此可重用)的组件组成,这些组件通过特定的应用程序逻辑粘合在一起。

在 Flux 中有特定领域的 Stores 封装数据和领域逻辑。这些可能会在同一域的另一个应用程序中重复使用。

我假设还应该有特定于应用程序的商店来保存应用程序状态和逻辑。这是胶水。

现在,我尝试将其应用于虚构的 "GPS Tracker" 应用程序:

...

当用户点击[停止跟踪]按钮时,相应的ViewController引发STOP_CLICK

所以,我有一个事件滚雪球。

据说在 Flux 中一个 Action 不应该引发另一个。 但是我不明白这是怎么做到的。

我认为用户操作不能直接进入域商店,因为这些应该是 UI-不可知的。 相反,AppState(或应用程序逻辑存在的任何地方)应该将用户操作转换为域操作。

  1. 如何重新设计这种通量方式?
  2. 应用程序逻辑应该放在哪里?
  3. 尝试使域商店独立于应用程序逻辑是否正确?
  4. "services"的地方在哪里?

谢谢。

所有应用程序逻辑都应该存在于商店中。如果有的话,他们决定应该如何回应特定的行动。

商店没有 setter。进入商店的唯一方法是通过调度操作,通过回调商店向调度程序注册。

动作不是 setter。尽量不要这样想。动作应该简单地报告现实世界中发生的事情用户以某种方式与UI互动,服务器以某种方式响应等

这看起来很像 setter-我的想法:

dispatch(STOP_GEOLOCATION)

dispatch(STOP_TRACKING)

相反,调度实际发生的事情:STOP_TRACKING_BUTTON_CLICKED(或 TRACKING_STOPPED,如果你想成为 UI 不可知论者)。然后让商店想办法解决这个问题。所有商店都将收到该操作,如果需要,它们都可以对此做出响应。您响应两个不同操作的代码应该响应相同的操作。

通常,当我们发现我们想要在一个分派中进行分派时,我们只需要回到最初发生的事情并让整个应用程序对此做出响应。