如何避免动作链

时间:2015-03-27 19:58:34

标签: reactjs-flux flux

我正在尝试了解Flux模式。

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

在Flux中,存在封装数据和域逻辑的特定于域的存储。这些可能可能在同一域的另一个应用程序中重用。

我假设还应该有特定于应用程序的商店,其中包含应用程序状态和逻辑。这是胶水。

现在,我尝试将其应用于想象中的“GPS追踪器”应用程序:

...

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

  • AppState.on(STOP_CLICK):

    • dispatch(STOP_GEOLOCATION)
    • dispatch(STOP_TRACKING)
  • GeolocationService.on(STOP_GEOLOCATION):

    • stopGPS(); this.on = false; emit('change')
  • TrackStore.on(STOP_TRACKING):

    • saveTrack(); calcStatistics(); this.tracking = false; emit('change')
    • dispatch(START_UPLOAD)

所以,我有一个活动雪球。

据说在Flux中,一个动作不应该引发另一个动作。 但我不明白如何做到这一点。

我认为用户操作无法直接进入域商店,因为这些应该与UI无关。 相反,AppState(或app逻辑所在的任何地方)应将用户操作转换为域操作。

  1. 如何重新设计Flux方式?
  2. 应用逻辑应该去哪里?
  3. 尝试保持域名存储独立于应用程序逻辑是否正确?
  4. “服务”的地方在哪里?
  5. 谢谢。

1 个答案:

答案 0 :(得分:4)

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

商店没有制定者。进入商店的唯一途径是通过调度操作,通过商店向调度员注册的回调。

操作不是设置者。尽量不要这样想。操作应该只是报告在现实世界中发生的事情用户以某种方式与UI交互,服务器在某种方式,等等。

这看起来很像我对他的思考:

  

调度(STOP_GEOLOCATION)

     

调度(STOP_TRACKING)

相反,调度实际发生的事情:STOP_TRACKING_BUTTON_CLICKED(或TRACKING_STOPPED,如果你想与UI无关)。然后让商店弄清楚如何处理它。所有商店都将收到该行动,如果需要,他们都可以回复。您对两个不同操作做出响应的代码应该响应相同的操作。

通常,当我们发现我们想要在调度中进行调度时,我们只需要备份到发生的原始事件并使整个应用程序对此做出响应。