Flux:如何让一个动作等待一个store



我把自己绑在一个React问题上,我确信这个问题不会像我现在看起来那么困难。

我正在构建一个针对RESTful服务器API的单页应用程序,该API返回资源,以及描述该资源可以做什么的链接。我试图确保客户端的ajax调用只使用以这种方式从服务器检索到的url。因此,例如,我的LoggedInSessionStore包含允许我获取所有公共文档列表的URL,例如。

我的问题是如何管理操作和存储之间的依赖关系。例如,当获取所有公共文档的操作触发时,它需要从LoggedInSessionStore获取它的URL。但这家商店可能还没有人满为患;因此,该操作必须在前一个操作(获取登录会话)完成之前才触发。

所以,我想要一个操作,可以获取服务器数据使用存储在存储的URL。确保在该存储被填充之前操作不能触发的公认方法是什么?

TL;DR不要将url存储在store中。让你的动作处理API调用。

一般来说,当使用Flux时,你的action不应该知道你的store。Flux应用程序中的数据应该在一个方向上流动:

Components --> Actions --> Dispatcher --> Stores --> Components

您的React组件创建操作,然后由Dispatcher分派到您的商店。store将通过其注册的回调通知操作,并相应地更新自己。组件将监听store更新自己,并相应地更新自己的状态。这样圆就完成了。

Actions不应该依赖于store

我的建议是将所有API逻辑转移到操作中。这包括API的url。这是一个在Flux应用中相当常见的模式:

  1. 组件在componentDidMount上触发一个获取操作。显示加载旋转器,因为它还没有渲染所需的数据。
  2. fetch动作调用AJAX从服务器获取数据。
  3. 当数据从服务器返回时,动作将其作为有效负载进行调度
  4. store查看负载并根据获取的数据设置其内部状态
  5. 组件看到store已经更新,并相应地更新自己的状态。这使得它渲染应用程序,而不仅仅是一个加载旋转器。

另一种选择是在您的存储中包含获取逻辑,包括AJAX请求代码。我发现前者更容易理解(商店什么都不知道,他们只是对可用的数据做出反应),但这取决于你想要如何实现它。只要确保API获取逻辑在一个地方是,而不是在Actions和Stores之间分割。

这个线程可能也有帮助:通量存储,或动作(或两者)应该接触外部服务?

最新更新