Redux 我是否可以始终将全状态传递给减速器?

Redux 我是否可以始终将全状态传递给减速器?,redux,react-redux,Redux,React Redux,如果我将我的减缩器设计成可以访问完整状态树,而不是只读取部分状态,那么会有任何不便吗 因此,与其写这封信: function reducer(state = {}, action) { return { a: doSomethingWithA(state.a, action), b: processB(state.b, action), c: c(state.c, action) } } 我分别使用、c或processB减缩器来分解dosomethingw中的结

如果我将我的减缩器设计成可以访问完整状态树,而不是只读取部分状态,那么会有任何不便吗

因此,与其写这封信:

function reducer(state = {}, action) {
  return {
    a: doSomethingWithA(state.a, action),
    b: processB(state.b, action),
    c: c(state.c, action)
  }
}
我分别使用、
c
processB
减缩器来分解
dosomethingw中的结构状态:

function reducer(state = {}, action) {
  return {
    a: doSomethingWithA(state, action), // calc next state based on a
    b: processB(state, action), // calc next state based on b
    c: c(state, action) // calc next state based on a, b and c
  }
}

我会用更多的内存吗?有什么表演不方便吗?我知道在javascript中,引用总是作为参数传递的,这就是为什么如果我们想更新状态或使用Immutable.JS强制实现不变性,我们应该返回一个新对象,所以。。。再说一次,这有什么不方便的吗?

没有,这没什么错。将更新逻辑编写为单个函数而不是单独的通量“存储”的部分原因是,它为您提供了对依赖链的显式控制。如果更新
state.b
的逻辑取决于先更新
state.a
,则可以这样做


您可能需要通读Redux文档中的部分,尤其是主题。除典型的
组合减速器
方法外,还讨论了其他各种减速器结构。在我的博客文章中,我也给出了一些这种结构的例子。

不,这没什么错。将更新逻辑编写为单个函数而不是单独的通量“存储”的部分原因是,它为您提供了对依赖链的显式控制。如果更新
state.b
的逻辑取决于先更新
state.a
,则可以这样做


您可能需要通读Redux文档中的部分,尤其是主题。除典型的
组合减速器
方法外,还讨论了其他各种减速器结构。我也在我的博客文章中给出了一些这种结构的例子。

从JS的角度来看,这很好。然而,这意味着重复使用错误的封装。为什么不以预期的方式封装子集合是错误的呢?我知道我们这些原子还原者只处理一件事,而且他们做得很好,但他们仍然做得很好。由于访问范围更广,所以我可以保持更平坦的结构。因为您引入了不同逻辑位之间的耦合-更改B的减缩器现在可以影响a的行为。好的,通过设计,您不应该更改a的行为,除非您依赖于B的输出。作为开发人员,你要负责哪一个,所以这将是一个设计决策,对吗?以及将状态封装到不同的集合中,这迫使我们编写更复杂的约简树。我认为这并不一定是坏事:您仍然只返回部分状态,但可以从现有状态读取任何内容。这完全取决于你是如何编写子减速器的。您失去了
combinereducer
或您的第一个示例所提供的一些封装保护,但获得了更强大的reducer。然而,这意味着重复使用错误的封装。为什么不以预期的方式封装子集合是错误的呢?我知道我们这些原子还原者只处理一件事,而且他们做得很好,但他们仍然做得很好。由于访问范围更广,所以我可以保持更平坦的结构。因为您引入了不同逻辑位之间的耦合-更改B的减缩器现在可以影响a的行为。好的,通过设计,您不应该更改a的行为,除非您依赖于B的输出。作为开发人员,你要负责哪一个,所以这将是一个设计决策,对吗?以及将状态封装到不同的集合中,这迫使我们编写更复杂的约简树。我认为这并不一定是坏事:您仍然只返回部分状态,但可以从现有状态读取任何内容。这完全取决于你是如何编写子减速器的。您失去了
combinereducer
或您的第一个示例提供的一些封装保护,但获得了更强大的reducer。