调度动作时会调用所有减速器吗?

ela*_*juh 35 redux

我使用combineReducers来组合所有reducers来创建存储,是否意味着从任何视图调度的任何操作都会触发所有调用的reducers来检查操作类型?它效率低吗?

或者我不完全理解redux设计原理?

lua*_*ped 21

对,那是正确的.

但是,您必须优化此行为的一个选项(从Redux文档中建议)是使用"重新选择" https://github.com/rackt/reselect

Reselect基本上允许你创建memoized选择器,你可以说道具A依赖于状态B和状态C,因此只有在状态B或状态C改变时才重新计算道具A.

请注意,这仍将触发所有reducers运行(并通过switch语句查看该操作是否适用于它们) - 我相信没有办法绕过这种行为.但是,使用重新选择意味着如果存在影响该状态的实际更改,则顶级组件将仅接收道具/状态更改,而不是每次都触发更改并使React重新呈现所有内容,即使更改无效因为它与某个地方无关.(重新选择的自述文件解释得更好)

  • 欢迎你:)尽管如此,尽管所有的reducers都被调用,但真正发生的事情是检查switch语句,只有处理该动作的reducer会做一些工作,所有其他的都不做任何事情,所以它真的不是这是一个性能问题.值得一提的是,现代JS将大型switch语句优化为具有O(1)访问时间的跳转表,因此您无需担心在reducers中评估大型switch语句,即使多次操作不匹配也是如此任何条件. (8认同)

Koc*_*r4d 6

是的 - 在您发送操作时,将调用所有减速器.你会得到一个很好的副作用.因为如果未找到操作,每个reducer都会返回默认状态,您可以使用单个操作设置初始状态.

虽然我还没有尝试过,但它可能是有益的,因为单个动作会影响多个减速器,也就是改变商店两个不同部分的状态.

当你添加重新选择它@luanped建议你可以得到很多恶心的结果!

我目前的筹码是:

  • Redux for state,action management
  • 重新选择数据转换层
  • 对视图做出反应

增加重新选择工作流程并使其与减速器一起工作是上周发生在我身上的最好的事情.