我正在尝试了解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逻辑所在的任何地方)应将用户操作转换为域操作。
谢谢。
答案 0 :(得分:4)
所有应用程序逻辑都应该存在于商店中。如果有的话,他们决定如何应对特定的行动。
商店没有制定者。进入商店的唯一途径是通过调度操作,通过商店向调度员注册的回调。
操作不是设置者。尽量不要这样想。操作应该只是报告在现实世界中发生的事情:用户以某种方式与UI交互,服务器在某种方式,等等。
这看起来很像我对他的思考:
调度(STOP_GEOLOCATION)
调度(STOP_TRACKING)
相反,调度实际发生的事情:STOP_TRACKING_BUTTON_CLICKED(或TRACKING_STOPPED,如果你想与UI无关)。然后让商店弄清楚如何处理它。所有商店都将收到该行动,如果需要,他们都可以回复。您对两个不同操作做出响应的代码应该响应相同的操作。
通常,当我们发现我们想要在调度中进行调度时,我们只需要备份到发生的原始事件并使整个应用程序对此做出响应。