Javascript Redux——为什么所有的州都在一个地方,即使是不是';t全球?

Javascript Redux——为什么所有的州都在一个地方,即使是不是';t全球?,javascript,reactjs,redux,Javascript,Reactjs,Redux,我是新的反应,甚至更新的Redux。到目前为止,在一个小沙盒应用程序中同时使用了这两种方法之后,我喜欢它们 但是,当涉及到更大的应用程序时,我开始怀疑这一点: 为什么Redux将整个应用程序状态保存在单个存储中 如果我有一个包含许多不同部分的应用程序(每个部分都有自己的组件),那么对我来说,保持每个部分的状态(在每个部分的顶级组件中)是有意义的,只要它们的状态不影响其他组件 我不确定在一个地方拥有所有东西的国家有什么好处,而这个国家的各个部分与其他部分没有任何关系。如果组件A不受组件B状态的影响

我是新的反应,甚至更新的Redux。到目前为止,在一个小沙盒应用程序中同时使用了这两种方法之后,我喜欢它们

但是,当涉及到更大的应用程序时,我开始怀疑这一点: 为什么Redux将整个应用程序状态保存在单个存储中

如果我有一个包含许多不同部分的应用程序(每个部分都有自己的组件),那么对我来说,保持每个部分的状态(在每个部分的顶级组件中)是有意义的,只要它们的状态不影响其他组件

我不确定在一个地方拥有所有东西的国家有什么好处,而这个国家的各个部分与其他部分没有任何关系。如果组件A不受组件B状态的影响,反之亦然,那么它们的状态不应该保存在组件中而不是根中吗


我不能将全局影响状态放在根目录下,并将特定于每个组件的状态放在它们自己的组件中吗?我关心的是将所有特定于组件的状态一直上链到全局状态对象(特别是当React强调自上而下的流时)。

对于用户界面应用程序,全局状态的主要优点是可以原子地跟踪整个应用程序的状态更改

tldr;你总是可以很容易地保存和预测应用程序的状态,因为只有一个真实来源

自状态管理组件的问题在于,它们会创建不可预测的可能状态组合。如果XComponent自身发生变化,您无法轻松判断应用程序将处于何种状态,因为您必须对YComponent和ZComponent进行争论,然后让他们了解彼此的状态,以便他们基于此做出决策并确定整个应用程序的状态

这实际上归结为上下文。如果我的决策依赖于了解应用程序状态的3个独立部分的状态,这些部分在UI组成方面没有直接关系,那么我如何获得做出该决策的上下文并将结果反馈给整个应用程序?如果无法访问完整的状态表示,就无法轻松获得上下文聚合

Redux(以及试剂中的ratom等其他模式)通过全局统一状态解决了这一问题。您的操作只是状态更改的信使,但您的存储是上下文持有者。如果没有一家商店,您的组件就像封建军阀为其松散相关的封地状态而争吵。该商店是紧密结合的寡头政治(
combineReducers()
)的产物,它以铁腕统治您的应用程序状态并远离bug:)

全局状态适用于UI,并解决了许多问题,即使对于其他类型的软件来说这是违反直觉的,甚至是不好的做法。也就是说,我们经常注意到,并非所有的应用程序状态都需要在Redux存储中。此外,您还可以清除不再有用/相关的数据。最后,只与给定组件(及其行为/显示)相关的状态不需要反映在全局存储中(必要)

Redux中的关注点分离抽象是一种简化方法,因为您可以创建多个简化方法,并将它们组合起来,为商店更新创建逻辑链


使用减缩器,您仍然在代码中“分离”您的状态逻辑,但事实上,在运行时它被视为一棵树。这使您的状态更改保持可预测性和原子性,但允许良好的组织、封装和分离关注点。

为什么我们要将持久状态移动到数据库中,而不是让每个后端组件在单独的文件中管理它们的状态

因为它使查询、调试和序列化整个应用程序状态变得更加容易。

Redux的灵感来自一种名为的语言,该语言还提倡使用单一模型。Elm的创建者进一步证明了为什么这是应用程序的重要质量

真相只有一个来源。传统的方法迫使您编写大量定制的、容易出错的代码,以便在许多不同的有状态组件之间同步状态。(此小部件的状态需要与应用程序状态同步,应用程序状态需要与其他一些小部件同步,等等)通过将所有状态放在一个位置,可以消除两个组件处于不一致状态的一整类错误。我们还认为,最终编写的代码会少得多。到目前为止,这是我们在Elm的观察结果

我发现这个概念更容易学习和理解,同时从ClojureScript和David Nolen的作品中学习和理解。该项目的主要目标也是一个很好的学习资源

以下是我个人的一些收获,来解释为什么全球国家是一个更优雅的解决方案

简单组件 在许多基于组件的有状态应用程序中出现的一种常见情况是,需要修改另一个组件中的状态

例如,单击
NameTag
组件中的编辑按钮应打开一个编辑器,该编辑器允许用户修改处于
配置文件
组件(NameTag的父级)状态的某些数据。解决此问题的方法是传递处理程序回调,然后将数据传播回组件树。这种模式导致React应用程序现有单向数据流中的子数据流混乱

对于全局状态,组件只需分派触发该状态更新的操作。组件和操作都可以参数化,以便将上下文信息发送回用户(例如,我应该编辑其姓名的用户的id是什么)

你不必这么做