如何避免动作链
How to avoid action chains
我正在尝试了解 Flux 模式。
我相信在任何好的设计中,应用程序都应该由相对独立和通用(因此可重用)的组件组成,这些组件通过特定的应用程序逻辑粘合在一起。
在 Flux 中有特定领域的 Stores 封装数据和领域逻辑。这些可能会在同一域的另一个应用程序中重复使用。
我假设还应该有特定于应用程序的商店来保存应用程序状态和逻辑。这是胶水。
现在,我尝试将其应用于虚构的 "GPS Tracker" 应用程序:
...
当用户点击[停止跟踪]按钮时,相应的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 中一个 Action 不应该引发另一个。
但是我不明白这是怎么做到的。
我认为用户操作不能直接进入域商店,因为这些应该是 UI-不可知的。
相反,AppState(或应用程序逻辑存在的任何地方)应该将用户操作转换为域操作。
- 如何重新设计这种通量方式?
- 应用程序逻辑应该放在哪里?
- 尝试使域商店独立于应用程序逻辑是否正确?
- "services"的地方在哪里?
谢谢。
所有应用程序逻辑都应该存在于商店中。如果有的话,他们决定应该如何回应特定的行动。
商店没有 setter。进入商店的唯一方法是通过调度操作,通过回调商店向调度程序注册。
动作不是 setter。尽量不要这样想。动作应该简单地报告现实世界中发生的事情:用户以某种方式与UI互动,服务器以某种方式响应等
这看起来很像 setter-我的想法:
dispatch(STOP_GEOLOCATION)
dispatch(STOP_TRACKING)
相反,调度实际发生的事情:STOP_TRACKING_BUTTON_CLICKED(或 TRACKING_STOPPED,如果你想成为 UI 不可知论者)。然后让商店想办法解决这个问题。所有商店都将收到该操作,如果需要,它们都可以对此做出响应。您响应两个不同操作的代码应该响应相同的操作。
通常,当我们发现我们想要在一个分派中进行分派时,我们只需要回到最初发生的事情并让整个应用程序对此做出响应。
我正在尝试了解 Flux 模式。
我相信在任何好的设计中,应用程序都应该由相对独立和通用(因此可重用)的组件组成,这些组件通过特定的应用程序逻辑粘合在一起。
在 Flux 中有特定领域的 Stores 封装数据和领域逻辑。这些可能会在同一域的另一个应用程序中重复使用。
我假设还应该有特定于应用程序的商店来保存应用程序状态和逻辑。这是胶水。
现在,我尝试将其应用于虚构的 "GPS Tracker" 应用程序:
...
当用户点击[停止跟踪]按钮时,相应的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 中一个 Action 不应该引发另一个。 但是我不明白这是怎么做到的。
我认为用户操作不能直接进入域商店,因为这些应该是 UI-不可知的。 相反,AppState(或应用程序逻辑存在的任何地方)应该将用户操作转换为域操作。
- 如何重新设计这种通量方式?
- 应用程序逻辑应该放在哪里?
- 尝试使域商店独立于应用程序逻辑是否正确?
- "services"的地方在哪里?
谢谢。
所有应用程序逻辑都应该存在于商店中。如果有的话,他们决定应该如何回应特定的行动。
商店没有 setter。进入商店的唯一方法是通过调度操作,通过回调商店向调度程序注册。
动作不是 setter。尽量不要这样想。动作应该简单地报告现实世界中发生的事情:用户以某种方式与UI互动,服务器以某种方式响应等
这看起来很像 setter-我的想法:
dispatch(STOP_GEOLOCATION)
dispatch(STOP_TRACKING)
相反,调度实际发生的事情:STOP_TRACKING_BUTTON_CLICKED(或 TRACKING_STOPPED,如果你想成为 UI 不可知论者)。然后让商店想办法解决这个问题。所有商店都将收到该操作,如果需要,它们都可以对此做出响应。您响应两个不同操作的代码应该响应相同的操作。
通常,当我们发现我们想要在一个分派中进行分派时,我们只需要回到最初发生的事情并让整个应用程序对此做出响应。