我觉得没有一个答案明确了为什么mapDispatchToProps
有用。
实际上,这只能在container-component
模式的上下文中得到回答,我首先阅读以下内容可以最好地理解该模式:容器组件,然后与React结合使用。
简而言之,您components
应该只关心显示内容。他们应该从中获取信息的唯一地方是他们的道具。
与“显示内容”(组件)分开的是:
那是containers
为了什么。
因此,模式中的“精心设计” component
如下所示:
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(来自redux存储,通过mapStateToProps
)获取它显示的信息,以及如何从props:获取其action函数sendTheAlert()
。
那就是mapDispatchToProps
进来的地方:在对应的container
// 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
)
我不知道你可以看到,现在它的container
1,它知道Redux的调度和存储以及州和......东西。
component
模式中的in进行FancyAlerter
渲染不需要了解任何东西:它onClick
通过其props 获取其在按钮处调用的方法。
还有... mapDispatchToProps
是redux提供的有用手段,它可以使容器轻松地将该函数传递给其props上的包装组件。
所有这些看起来都非常像docs中的todo示例,还有另一个答案,但是我试图根据模式来强调它为什么。
(请注意:您不能mapStateToProps
出于mapDispatchToProps
无法访问dispatch
内部的基本原因而将其用于同一目的mapStateToProp
。因此,您不能使用mapStateToProps
来为包装的组件提供使用的方法dispatch
。
我不知道他们为什么选择将其分为两个映射功能-IE可以mapToProps(state, dispatch, props)
同时使用这两个功能可能更简单!
1 请注意,我故意将容器明确命名为FancyButtonContainer
,以强调它是一个“事物”- 容器的“物”的身份(并因此存在!)有时会在速记中丢失
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
大多数示例中显示的语法