为什么`mapDispatchToProps`看不到`stateProps`?

时间:2016-08-29 03:53:17

标签: redux react-redux

简介

mapDispatchToProps的签名是:

mapDispatchToProps(dispatch, [ownProps]): dispatchProps

有人可能会想,为什么mapDispatchToProps也没有提供stateProps,即mapStateToProps电话的结果。替代语法可以是:

mapDispatchToProps(dispatch, [ownProps], [stateProps]): dispatchProps

在我看来,这并没有破坏任何东西(甚至不是性能),并且在某些情况下可能是有益的。

问题

有没有理由不实施?我错过了什么吗?如果没有此功能,您将如何解决下面显示的用例?

为什么它不会破坏任何东西

此类更改将允许用户使用dispatchProps自定义stateProps个功能。当stateProps更改时,React-Redux可以使用实际的dispatchProps重新计算stateProps并重新呈现该组件。这种逻辑已经在ownProps

中发生

性能

如果用户不需要阅读stateProps,他们可以省略mapDispatchToProps实施中的参数。 React-Redux可以检测到这一点并假设dispatchProps不依赖于stateProps。此类性能调整已针对ownProps实施。

用例

假设我有10个动作(创作者)来处理特定的待办事项。这10个动作如下:

changeTitle(todoId, title) {
  return {
    type: 'changeTitle',
    todoId,
    title,
  }
}
// etc...

如果所有10个动作(创作者)都需要todoId,那么对动作(创作者)进行部分实例化可能是有意义的(可以更简洁地书写,但这不相关现在):

actionsForTodo(todoId) {
  return {
    changeTitle: (title) => ({
      type: 'changeTitle',
      todoId,
      title,
    }),
    // more action(creator)s here
  }
}

然后只为所有操作(创建者)提供todoId

mapDispatchToProps((dispatch, ownProps, stateProps) => 
  bindActionCreators(actionsForTodo(stateProps.todoId)))

1 个答案:

答案 0 :(得分:3)

实际上会对性能产生负面影响。由于mapState的结果是存储状态的函数,并且可能是组件自己的传入道具,因此每次输出{{1}时都需要重新运行mapDispatch几乎肯定会导致每次都分配新的函数对象。在几乎所有情况下,这都会浪费CPU周期。当您从组件中调用这些函数时,简单地将特定于项的值作为参数传递会更加简单。

支持的解决方法:mapState changes的第三个参数是connect()函数, 获取{{}的输出1}}和mergeProps,可以自定义它们如何合并在一起。如果该用例对您很重要,您可以通过提供mapState函数自行实现逻辑。

也就是说,即将推出的React-Redux@5.0.0预发布版本是对实现的重大改写, 现在有一个新的mapDispatch函数支持这种类型的场景更好。请参阅https://github.com/reactjs/react-redux/pull/416