为什么调度到减速器会导致所有减速器都被调用?

won*_*rld 5 redux react-redux

在这个github redux 示例中,事件 ADD_TODO 的调度用于添加任务。在调试时,我发现,添加任务使两者减速 待办事项visibilityFilter被调用。

添加任务时,如何仅调用todos减速器而不是visibilityFilter减速器。如果我发送了一个 SET_VISIBILITY_FILTER 类型的事件,还有visibilityFilter reducer。

mar*_*son 5

combineReducers实用程序有意为每个操作调用所有附加的 reducer 函数,并为它们提供响应的机会。这是因为建议的 Redux 减速器结构是“减速器组合”,其中许多主要独立的减速器功能可以组合成一个结构,并且许多减速器功能可能会响应单个操作并更新它们自己的状态切片。

  • 我担心的是 [MapStateToProps](https://github.com/reactjs/redux/blob/master/examples/todos/containers/VisibleTodoList.js) 方法,该方法被所有容器组件调用。就我而言,我有 5 个容器组件。当一个 action 被调度时,它应该只更新一个容器,而不是任何子组件或兄弟组件。我看到所有 5 个容器都调用了 **MapStateToProps** 函数,并且正在浪费资源。有没有办法阻止 **MapStateToProps** 被执行? (2认同)
  • 不。你误解了 `mapStateToProps` 背后的意图,以及 React-Redux `connect()` 函数如何使用它。由于 Redux 中只有一个状态树,任何调度的 action _可能_更新了状态的任何部分,并且只有一个订阅通知。因此,`connect()` 重新运行 _all_ 订阅的 MSTP 函数,然后对每个函数的结果进行浅层比较,以查看与上次调用相比是否有任何更改。如果 MSTP 的输出相同,则不会重新渲染组件。您_希望_ MSTP 每次都重新运行。 (2认同)