2017-05-04 72 views
3

我来自Elm-comunity和Elm,每个应用程序都有它的视图,它的模型和它的状态,基本上采用非常类似的方法IMO解决问题。Redux - 一对多缩减器

无论如何,我发现自己正在与多个减速器的想法挣扎。在Elm中,我用来为所有动作(Messages)制作一个单独的文件,一个用于“反应”(View)的独立文件,一个用于状态(Model)的独立文件,以及一个用于所有Reducer(Update)的独立文件。

每个可能的操作都在Update文件中被覆盖,更新文件不能通过多个文件传播,将所有的逻辑保存在一个地方。

另一方面,Redux鼓励为reducer制作多个单独的文件,然后再将它们与combineReducers结合使用,我发现这些文件非常混乱,并且或多或少都是劣势而非优势。

如果我把事情做好,每个减速器只会得到它“负责”的部分,并且能够对它做些事情,而不同的减速器不能访问其他减速器的其他状态/特性。

缺点IMO这样做的:

  1. 从减速器的功能可能需要大约从减速B信息的信息,但是因为这不能被访问。
  2. 更多文件导致更多混乱和无意的错误。
  3. 不必要的代码分割。 ...

什么是分裂代码的优点或我没有看到这里的东西?

回答

5

我会试图解释丹阿布拉莫夫识别这个线程和写入另一个惊人的答案:-)

缺点前:

从减速器的功能可能需要大约从减速B信息的信息,但因此无法访问。

这个问题并没有真正发生,因为它完全取决于你如何组合减速器。如果reducer仅对状态树的一部分感兴趣,那么combineReducers将确保它只接收该部分。但是如果它需要更多的状态,那么你就会应用这个特定的减速器,使其接收整个状态。

整个应用程序最终只有一个reducer - 处理整个状态和所有操作的应用程序 - 但您可能希望在某个时候将应用程序代码拆分为与主题相关的模块,所以编写较小的与主题相关的缩减器并将它们合并为一个更容易。 combineReducers只是一个帮手,可以让您在需要时方便地进行操作。

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

由您决定何时拆分您的代码。我喜欢在不同的文件中保留不相关的功能。例如,如果我的网络应用程序有一个聊天模块,我可能会制作一个chat包,并将所有与聊天相关的代码放在那里 - 一个视图,一堆动作和理解这些动作的reducer。


移动到利弊:

combineReducers是有用的,因为它的作品真的很好用可重复使用的应用程序。例如,我可以编写与意见涉及的模块......它的一部分将是一个减速,如:

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不知道文章的整体概念!所以我不希望它接收整个状态 - 它不知道如何处理它。我想让这个减速器只接收与其评论对应的状态部分。

请注意,我可以同时有很多文章,也可能是其他可评论的东西。通过巧妙的缩减器组合,您可以拥有多个评论应用程序的“实例”,每个“实例”只处理它自己的一小部分状态。这需要比单独的combineReducers更智能的胶水代码,但是它显示了当reducer只需要应用程序状态的特定部分 - 关注点分离时的情况。