我觉得没有一个答案明确说明为什么mapDispatchToProps
有用。
这实际上只能在container-component
模式的上下文中得到回答,我发现通过第一次阅读可以最好地理解它:Container Components then Usage with React。
简而言之,您components
应该只关心显示内容。他们应该从中获取信息的唯一地方是他们的props。
与“显示内容”(组件)分开的是:
那是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 store 通过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、dispatch、store、state 和......东西。
该component
图案中,FancyAlerter
,这并呈现并不需要了解任何东西:它得到它的方法调用的onClick
按钮,通过它的props。
并且 ...mapDispatchToProps
是 redux 提供的有用方法,可以让容器轻松地将该函数传递到其 props 上的包装组件中。
所有这些看起来都非常像文档中的 todo 示例,还有这里的另一个答案,但我试图根据模式进行投射以强调原因。
(注意:您不能mapStateToProps
出于与mapDispatchToProps
您无权访问dispatch
inside的基本原因相同的目的而使用mapStateToProp
。因此,您不能使用mapStateToProps
为包装的组件提供使用dispatch
.
我不知道他们为什么选择将它分解为两个映射函数——让mapToProps(state, dispatch, props)
IE 一个函数同时执行这两个函数可能会更整洁!
1 请注意,我特意明确地命名了容器FancyButtonContainer
,以强调它是一个“事物”——容器作为“事物”的身份(因此存在!)有时会在速记中丢失
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
大多数示例中显示的语法