我会试图解释丹阿布拉莫夫识别这个线程和写入另一个惊人的答案:-)
缺点前:
从减速器的功能可能需要大约从减速B信息的信息,但因此无法访问。
这个问题并没有真正发生,因为它完全取决于你如何组合减速器。如果reducer仅对状态树的一部分感兴趣,那么combineReducers
将确保它只接收该部分。但是如果它需要更多的状态,那么你就会应用这个特定的减速器,使其接收整个状态。
整个应用程序最终只有一个reducer - 处理整个状态和所有操作的应用程序 - 但您可能希望在某个时候将应用程序代码拆分为与主题相关的模块,所以编写较小的与主题相关的缩减器并将它们合并为一个更容易。 combineReducers
只是一个帮手,可以让您在需要时方便地进行操作。
- 更多文件导致更多混乱和无意的错误。
- 不必要的代码分割。 ...
由您决定何时拆分您的代码。我喜欢在不同的文件中保留不相关的功能。例如,如果我的网络应用程序有一个聊天模块,我可能会制作一个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只需要应用程序状态的特定部分 - 关注点分离时的情况。
来源
2017-05-04 08:37:13
Kos