Redux - 单个 vs 多个reducers

6

我来自Elm社区,在Elm中,每个应用程序都有其视图、模型和状态,并且基本上采用与redux解决问题非常相似的方法,以我的看法。

无论如何,我发现自己在多个reducer的想法上遇到了困难。在Elm中,我习惯于为所有操作(消息)制作一个单独的文件,为“react”(视图)制作一个单独的文件,为状态(模型)制作一个单独的文件,以及为所有reducer制作一个单独的文件(更新)。

每个可能的操作都被包含在更新文件中,更新文件不能通过多个文件进行传播,将所有逻辑保持在一个地方。

另一方面,Redux鼓励将reducer分成多个单独的文件,然后使用combineReducers将它们组合起来,这让我感到非常困惑,更多的是劣势而不是优势。

如果我理解正确,每个reducer只获取它“负责”的部分,并且可以对其执行某些操作,不同的reducer不能访问其他状态属性/其他reducer的属性。

这样做的缺点:

  1. 来自reducer A的函数可能需要关于reducer B的信息,但由于此原因无法访问。
  2. 更多的文件会导致更多的混乱和意外错误。
  3. 不必要的代码分割。 ...

分割代码的优点是什么,或者我看漏了什么?


请参见 https://redux.js.org/recipes/structuring-reducers/splitting-reducer-logic。 - Michael Freidgeim
1个回答

15

在 Dan Abramov 看到这个帖子并写出另一个惊人答案之前,我会尝试解释一下:

缺点:

来自 reducer A 的函数可能需要访问 reducer B 中的信息,但由于这种情况无法访问。

实际上这个问题并不会发生,因为你完全可以自己决定如何组合 reducers。如果一个 reducer 只关心 state 树中的一部分,那么 combineReducers 将确保它只收到这部分。但如果它需要更多的状态,则可以以某种方式应用这个特定的 reducer,使其接收整个 state。

最终整个应用程序只会有一个 reducer - 负责处理整个状态和所有操作 - 但你可能希望将应用程序代码分成与主题相关的模块,以便更容易编写较小的主题相关的 reducers,并将它们组合成一个大的 reducer。combineReducers 只是一个助手函数,可以在需要时方便地使用它来实现。

  1. 更多文件会导致更多混乱和意外错误。
  2. 不必要的代码拆分......

何时拆分代码取决于你。我喜欢将不相关的功能放在不同的文件中。例如,如果我的 Web 应用程序有一个聊天模块,我可能会创建一个 chat 包,并将所有与聊天相关的代码放入其中 - 视图、一堆操作以及理解这些操作的 reducer。


接下来是优点:

combineReducers 对于可重用的应用程序非常有帮助。例如,我可以编写一个处理评论的模块...... 其中的一部分将是一个 reducer,如下所示:

const initialState = {
  commentList: [],  // list of { author, text, upvotes }
  commentingAllowed: true,
}

function commentReducer(state, action) {
  if (typeof state === 'undefined') {
    return initialState;
  }
  switch (action.type) {
    // ...
  }
}

但是我的应用程序的实际状态可能更加复杂,例如:

{
  currentArticle: {
    title: "Some article",
    published: "2017-04-05",
    author: "someone",
    comments: {
      commentList: [],
      commentingAllowed: true,
    }
  }
}

评论状态是嵌套在currentArticle下的,但我的评论应用程序(尤其是commentReducer)不了解文章的整个概念!因此,我不希望它收到整个状态-它不知道该如何处理。我希望这个reducer只接收与其评论相对应的状态部分。

请注意,我可能同时有许多文章,也可能有其他可评论的东西。通过巧妙地组合reducers,您可以拥有多个评论应用程序的“实例”,每个实例只负责自己的一小部分状态。这需要比单独使用combineReducers更聪明的粘合代码,但它展示了当reducer只想要特定部分的应用状态时的情况-关注点分离。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接