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)))
答案 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。