如何使用应用商店管理 Flux/ReactJS 应用中的状态?

How to manage state in a Flux/ReactJS app with Stores?

在 FLUX/ReactJS 架构中,我很好奇以下方法是否违反(或只是不推荐)FLUX 流程。

1) 我们有 2 家商店。商店 A 和商店 B。

2) 我们有一个 "App" 组件,它从存储 A 设置了状态并将其向下传递给组件 1 和组件 2。

3) 组件 1 使用接收到的数据 "this.props" 并呈现内容。

4) 组件 2 使用接收到的 "this.props" 中的数据,但也有自己的基于商店 B 的状态(与 "App Component" 有自己的状态的方式相同)。

根据我的理解 - 理想情况下 - 我会让 "App Component" 收听商店 A 和商店 B 并将所有内容传递给其他组件。

但是,在现实生活中的应用程序中,假设有 100 家商店,每家商店都有自己的条件(您可以说如果不满足特定数据组合,组件 2 将不会呈现,等等) .这将使 App Component 成为一个 GOD-like 组件,可以处理如此多的东西。在我看来不切实际。

在我看来,即使您没有管理所有状态并将其向下传递给组件的顶级组件,您仍然可以获得 one-direction 数据流 - 因为状态仍然由Stores,而不是组件本身(您可以通过 Actions->Dispatcher->Store 触发事件)。如果您想在组件中封装特定行为,这在我看来特别好。

想象一下以下场景:

AppComponent -> AuthComponent -> LoginFormComponent

AppComponent -> ListItemsComponent -> SingleItemComponent

如果 AppComponent 知道 "AuthStore" 状态,以便它可以通过 props 将它传递给 AuthComponent,那会不会很奇怪? 如果 AppComponent 什么都不知道(在这个例子中)并且只是渲染 2 children; 不是更好吗? AuthComponent 会监听 AuthStore 并将信息传递给 登录表单; ListItemsComponent 会监听 ListItemsStore 并将所需的信息传递给 SIngleItemComponent 等。

你们会采用哪种方法?

理论上,如果您的较低级别组件是完全隔离的,并且根据其状态,您需要更改较高级别(或同一级别)组件的状态的可能性为 0%,那么就没有问题在组件本身内管理其状态。

然而也有缺点:

  1. 如果稍后您决定使用组件中更高的状态 您需要重构的层次结构。
  2. 它使组件更少 可重复使用的。你需要有相同的商店,相同的动作等。而如果你通过道具接收状态,你可以更容易地将它插入其他项目。
  3. 这让测试变得更加困难。

我会说,如果它是一个大型独立组件,有许多较低的组件,那么将状态保留在其中是有意义的,但通常应用程序中只有一个这样的组件。如果它更像是一个小型的、单一用途的组件,那么这样做就没有意义了。