【问题标题】:Where to fetch initial state when using flummox (flux)?使用flummox(flux)时在哪里获取初始状态?
【发布时间】:2015-08-02 09:18:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: reactjs reactjs-flux flummox


    【解决方案1】:

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

    不同的 Flux 实现有很多变化,而且真的没有正确或错误的方式。

    操作

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

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

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

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

    回答

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

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

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

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

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

    【讨论】:

    • 感谢您提供信息丰富的回复!对我来说,大开眼界的部分是你在行动和问题之间做出区分的地方,以帮助确定是否应该在行动或商店中进行某些事情。这是我将遵循的一个很好的经验法则。
    猜你喜欢
    • 2015-10-13
    • 2017-01-25
    • 2015-01-31
    • 2020-01-05
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多