我使用combineReducers来组合所有reducers来创建存储,是否意味着从任何视图调度的任何操作都会触发所有调用的reducers来检查操作类型?它效率低吗?
或者我不完全理解redux设计原理?
答案 0 :(得分:20)
是的,这是正确的。
但是,您必须优化此行为的一个选项(从Redux文档中建议)是使用“重新选择”https://github.com/rackt/reselect
重新选择基本上允许你创建记忆选择器,你可以说道具A依赖于状态B和状态C,因此只有在状态B或状态C改变时才重新计算道具A.
请注意,这仍然会触发所有reducers运行(并通过switch语句查看该动作是否适用于它们) - 我相信没有办法绕过这种行为。但是,使用重新选择意味着如果存在影响该状态的实际更改,则顶级组件将仅接收道具/状态更改,而不是每次都触发更改并使React重新呈现所有内容,即使更改无效因为它与某个地方无关。 (重新选择的自述文件解释得更好)
答案 1 :(得分:6)
是 - 在您发送操作时,将调用所有减速器。你会得到一个很好的副作用。因为如果找不到操作,每个reducer都会返回默认状态,您可以通过单个操作设置初始状态。
虽然我还没有尝试过,但它可能是有益的,可以让单个动作影响多个减速器,也可以改变商店两个不同部分的状态。
当你添加重新选择时,@ luanped建议你可以得到很多恶心的结果!
我目前的筹码是:
在工作流程中添加重新选择并使其与减速器一起工作是上周发生在我身上的最好的事情。
答案 2 :(得分:1)
您可以使用https://github.com/omnidan/redux-ignore
忽略特定减速器的动作。import { combineReducers } from 'redux';
// redux-ignore higher-order reducer
import { ignoreActions } from 'redux-ignore'
combineReducers({
counter: ignoreActions(counter, [INCREMENT_COUNTER])
});
也可以在官方网站上了解性能 https://redux.js.org/faq/performance/#wont-calling-all-my-reducers-for-each-action-be-slow