React Flux:存储依赖项

Posted

技术标签:

【中文标题】React Flux:存储依赖项【英文标题】:React Flux: Store dependencies 【发布时间】:2014-11-17 14:57:26 【问题描述】:

所以我最近在玩 React 和 Flux 架构。

假设有 2 个 Store A 和 B。A 依赖于 B,因为它需要 B 的一些值。所以每次调度程序调度一个动作时,首先执行 B.MethodOfB,然后执行 A.MethodOfA。

我想知道与将 A 注册为 B 的侦听器并在每次 B 发出更改事件时执行 A.MethodOfA 相比,这种架构有什么优势?

顺便说一句:考虑一下没有来自 facebook 的示例调度程序的“switch case”的 Flux 实现!

【问题讨论】:

【参考方案1】:

事件处理方法的问题在于,您无法保证哪些处理程序将首先处理给定事件。因此,在一个非常庞大、复杂的应用程序中,这可能会变成一个错综复杂的网络,您不确定何时会发生什么,这使得商店之间的依赖关系管理变得非常困难。

基于回调的dispatcher 的好处是双重的:商店更新自身的顺序在需要此排序的商店中声明,并且还保证完全按预期工作。这也是 Flux 的主要目的之一——让应用的状态变得可预测、一致且稳定。

在保证不会随时间增长或变化的非常小的应用程序中,我无法反驳您的建议。但最终,小型应用程序有发展成大型应用程序的趋势。这通常发生在任何人意识到它正在发生之前。

Flux 当然还有其他方法。已经创建了相当多的不同实现,它们对这个问题有不同的方法。但是,我不确定这些实验中的哪些可以很好地扩展。另一方面,Facebook's Flux repo 中的调度程序和documentation 中描述的方法已经扩展到真正巨大的应用程序,并且经过了实战考验。

【讨论】:

还有雅虎的flux examples,它提供了一些细微的变化。 看起来像 Yahoo!也使用回调方法,至少在他们自己的调度程序中:github.com/yahoo/dispatchr/blob/master/lib/… 然后github.com/yahoo/dispatchr/blob/master/lib/Action.js#L36-L69 你好@fisherwebdev,你对我的回答有什么意见吗?【参考方案2】:

在我看来,我认为这个调度程序在某种程度上是一种反模式。

在基于事件溯源或 CQRS 的分布式架构中,自治组件不必相互依赖,因为它们共享相同的事件日志。

不是因为您在同一主机(浏览器/移动设备)上,您不能应用这些概念。然而,拥有自治存储(无存储依赖)意味着同一浏览器上的 2 个存储可能会有重复的数据,因为 2 个不同的存储可能需要相同的数据。这是要付出的代价,但我认为从长远来看它有好处,因为它消除了对商店的依赖。这意味着您可以完全重构一个商店,而不会对不使用该商店的组件产生任何影响。

就我而言,我使用这样的模式并创建某种自治小部件。自治小部件是:

监听事件流的商店 一个组件 一个 LESS 文件(现在可能因为 React 样式而无用?)

这样做的好处是,如果给定小部件上存在错误,则该错误几乎不会涉及除上面提到的 3 个文件之外的任何其他文件;)

缺点是托管相同数据的商店也必须维护它。在某些事件中,许多商店可能必须对其本地数据执行相同的操作。

我认为这种方法更适合大型项目。

在这里查看我的见解:Om but in javascript

【讨论】:

投反对票的人会毫不犹豫地解释原因。这也是现在非常流行的 Redux 框架的方法,它从 Flux 中汲取灵感并移除存储依赖以支持可组合性 我也认为 Redux 是要走的路,但我不完全理解你的答案。也许这就是为什么有人投反对票...

以上是关于React Flux:存储依赖项的主要内容,如果未能解决你的问题,请参考以下文章

反应通量动作并存储类依赖项

React.js + Flux - 正确初始化存储中的数据对象

通量存储数据指针与依赖项

React/Flux 存储不会改变它的状态

如何调用存储在 Store.js (React-Flux) 中的组件中的值

React/Flux - 监控 api 和更新存储新数据的最佳方式?