如何处理 Flux 中的非视图更改操作 & React.js

How to handle non-view-altering actions in Flux & React.js

在 Flux 中,每个动作都应由调度程序处理。

不改变视图或标记的操作怎么样,例如 "scroll this element into view"?处理这种情况的 "Flux-way" 是什么?绕过调度员?或者在不涉及商店或组件的情况下在调度程序中处理它?

如果您的应用不需要知道滚动(似乎很少见),则无需触发操作。由于 Flux 确实在那里处理数据流(以及基于该数据流的后续更改),因此它不需要了解发生的每个操作。

Flux 实际上更多的是关于应用程序状态管理,而不是关于在视图中呈现哪些组件的细节。那是 React 的领域。 Flux 只是假设您有某种反应式视图层——通常是 React。

应用程序状态与组件状态不同。应用程序状态是需要在多个组件中知道的东西。对于组件状态,React 的 this.state 完全足够了。输入组件是可能需要它的一个很好的例子。

所以在您的情况下,如果只有一个组件需要知道滚动位置,那么将该状态移动到 Flux Store 可能不是一个好的案例。但是一旦需要在多个组件中知道它——尤其是树的不同分支中的组件——你可能希望在 Store 中管理该状态。

您提出的另一个问题是 Flux Actions 的作用。 Flux 应用程序始终使用 Actions 作为数据流的来源。这样做有很多充分的理由:稳定的应用程序状态、保持应用程序对新功能的弹性、使其易于推理、撤消历史记录、应用程序状态的重构、无状态视图组件等。

有时人们希望编写尽可能少的代码,他们使用在组件之间传递的回调来更改父组件中的 this.state,而不是调度新操作来通过 Flux 数据流。我发现这混合了应用程序的视图和状态管理层,虽然很方便,但这会导致很多麻烦。它在长 运行 中不是很灵活,因为现在状态与这几个组件耦合。从头开始构建 Flux 数据流在 long 运行 中要简单得多,并且对新功能的适应性也更强。也就是说,它还需要预先对代码进行更多投资。