您不应该直接在组件componentDidMount 中使用Ajax 请求从服务器加载状态。这样做的原因是 Flux 的目的是向组件隐藏状态获取/管理的细节。 Flux 实现应该为您做到这一点。
不同的 Flux 实现有很多变化,而且真的没有正确或错误的方式。
操作
在谈到操作以及您使用它们的目的时,需要考虑一件事。一个动作应该是改变你的应用程序状态的东西。您可以将所有操作组合为应用于您的状态的一堆事务。一个操作会将您的应用程序数据从一种状态转换到另一种状态。
因此,如果您要释放所有应用程序状态,您只需以正确的顺序再次应用所有操作,您最终会得到相同的状态。那么为什么这很重要呢?因为它告诉你什么不应该使用动作。
一些 Flux 实现倾向于混合操作(如“更新此待办事项”)和问题(如“给我 id 为 2 的待办事项”)。这可能很方便,但它有点模糊了动作的定义。一个问题不会改变状态,它只是从中读取。
问题应该作为 Stores 上的方法来实现,例如 TodoStore.getItem(id)(Flummox 似乎更喜欢)。
回答
所以回答你的问题:即使获取初始状态是异步的,并且看起来很适合某个动作,因为 Flummox 对它们有很好的异步支持,我会在 Store 中加载初始状态(可能使用简单的 Ajax请求,然后在商店致电setState)。这是因为 Store 拥有状态并且应该知道如何处理它。然后,一个组件会向 Store 询问所有项目(使用 Flummox 的 FluxComponent 或 fluxMixin)。它会为第一次渲染提供一个空列表,但只要 Ajax 请求完成对 Store.setState() 的调用,就会触发完整列表的重新渲染。
将所有应用程序状态保存在内存中
这原来是一堵文字墙,但我想再指出一件事。大多数 Flux 实现(包括 Flummox)都主张将整个应用程序状态保存在存储区的内存中。这在很多情况下都很好,但是如果您的应用程序有大量数据,那么它就会开始崩溃。不仅因为内存使用,还因为搜索您不想遍历数千个对象以找到匹配项之类的事情,您需要一个可以为您处理的数据库。
因此,对于这些情况,您可能希望将状态存储在 IndexedDB 或 WebSQL 中,并且很难将其与期望它是同步内存对象的 Flux 实现集成。
如果您不希望在客户端上需要那么多应用程序状态,那么使用 Flummox 或任何其他 Flux 实现就可以了,但它需要保留在内存中(不是双关语)。