5

我试图弄清楚在使用通量库 Flummox 时在哪里加载初始状态。我已经看到了几种方法,但我很好奇是否有推荐的方法。假设您有一些已保存在本地存储或数据库或其他东西中的待办事项。您将在哪里获取这些并将它们放入您商店的状态?

我已经看到它建议在 react's 中执行实际的 ajax 查询componentDidMount,并触发一个动作,将 ajax 的结果传递给该动作。该数据将流入商店的状态并作为您的初始状态返回视图。

我还看到它建议在操作本身内部执行 ajax,flummox 似乎通过它们的异步等待支持很好地支持。我猜在这种情况下,您只会触发一些获取初始状态的操作?

4

1 回答 1

5

您不应该直接在组件中使用 Ajax 请求从服务器加载状态componentDidMount。这样做的原因是 Flux 的目的是向组件隐藏状态获取/管理的细节。Flux 实现应该为您做到这一点。

不同的 Flux 实现有很多变化,实际上没有正确或错误的方法。

行动

当涉及到操作以及您使用它们的目的时,需要考虑一件事。一个动作应该是改变你的应用程序状态的东西。您可以将所有操作组合为应用于您的状态的一堆事务。操作将您的应用程序数据从一种状态转换到下一种状态。

因此,如果您要释放所有应用程序状态,您只需以正确的顺序再次应用所有操作,您最终会得到相同的状态。那么为什么这很重要呢?因为它告诉你什么不应该使用动作。

一些 Flux 实现倾向于混合操作(如“更新此待办事项”)和问题(如“给我 id 为 2 的待办事项”)。这可能很方便,但它有点模糊了动作的定义。一个问题不会改变状态,它只是从中读取。

问题应该作为 Stores 上的方法来实现,比如TodoStore.getItem(id)(Flummox 似乎更喜欢)。

回答

所以回答你的问题:即使获取初始状态是异步的并且看起来很适合某个动作,因为 Flummox 对它们有很好的异步支持,我会在 Store 中加载初始状态(可能使用简单的 Ajax 请求,然后致电setState商店)。这是因为 Store 拥有状态并且应该知道如何处理它。然后,一个组件会向 Store 询问所有项目(使用 FlummoxFluxComponentfluxMixin)。它会为第一次渲染提供一个空列表,但是一旦 Ajax 请求完成调用,Store.setState()就会触发带有完整列表的重新渲染。

将所有应用程序状态保存在内存中

原来这是一堵文字墙,但我想再指出一件事。大多数 Flux 实现(包括 Flummox)都主张将整个应用程序状态保存在存储区的内存中。这在很多情况下都很好,但是如果您的应用程序有大量数据,那么它就会开始崩溃。不仅因为内存使用,还因为搜索您不想遍历数千个对象以找到匹配项之类的事情,您需要一个为您处理的数据库。

因此,对于这些情况,您可能希望将状态存储在IndexedDBor中WebSQL,并且很难将其与期望它是同步内存对象的 Flux 实现集成。

如果您不希望在客户端上需要那么多应用程序状态,那么您可以使用 Flummox 或任何其他 Flux 实现,但它需要保留在内存中(没有双关语)。

于 2015-05-21T06:29:26.377 回答