我觉得没有一个答案能明确说明为什么mapDispatchToProps是有用的。
这个问题只能在容器组件模式的上下文中回答,我发现最好的理解方式是先阅读《容器组件然后使用React》。
简而言之,你的组件应该只关心显示内容。他们唯一能得到信息的地方就是他们的道具。
与“显示内容”(组件)分开的是:
你如何把东西展示出来,
以及你如何处理事件。
这就是容器的作用。
因此,模式中“设计良好”的组件看起来是这样的:
class FancyAlerter extends Component {
sendAlert = () => {
this.props.sendTheAlert()
}
render() {
<div>
<h1>Today's Fancy Alert is {this.props.fancyInfo}</h1>
<Button onClick={sendAlert}/>
</div>
}
}
看看这个组件如何从props(通过mapStateToProps来自redux存储)中获得它所显示的信息,它还从它的props中获得它的动作函数:sendTheAlert()。
这就是mapDispatchToProps的用武之地:在相应的容器中
// FancyButtonContainer.js
function mapDispatchToProps(dispatch) {
return({
sendTheAlert: () => {dispatch(ALERT_ACTION)}
})
}
function mapStateToProps(state) {
return({fancyInfo: "Fancy this:" + state.currentFunnyString})
}
export const FancyButtonContainer = connect(
mapStateToProps, mapDispatchToProps)(
FancyAlerter
)
我想知道你是否能看到,现在它是容器1,它知道redux,调度,存储,状态和…的东西。
该模式中的组件FancyAlerter,它进行渲染,不需要知道任何这些东西:它通过它的props在按钮的onClick处调用它的方法。
和…mapDispatchToProps是redux提供的一种有用的方法,可以让容器轻松地将该函数传递到其props上的包装组件中。
所有这些看起来都很像文档中的todo示例,这里还有另一个答案,但我试图把它放在模式的光照下,以强调原因。
(注意:你不能将mapStateToProps用于与mapDispatchToProps相同的目的,其基本原因是你不能访问mapStateToProp内部的调度。因此,您不能使用mapStateToProps为包装组件提供使用分派的方法。
我不知道为什么他们选择把它分成两个映射函数-它可能会更整洁的mapToProps(状态,调度,道具)IE一个函数来做这两件事!
1注意,我故意显式地将容器命名为FancyButtonContainer,以突出它是一个“东西”——容器作为“东西”的身份(因此存在!)有时会在简写中丢失
导出默认连接(…)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
大多数示例中显示的语法