我觉得没有一个答案明确说明为什么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您无权访问dispatchinside的基本原因相同的目的而使用mapStateToProp。因此,您不能使用mapStateToProps为包装的组件提供使用dispatch.
我不知道他们为什么选择将它分解为两个映射函数——让mapToProps(state, dispatch, props) IE 一个函数同时执行这两个函数可能会更整洁!
1 请注意,我特意明确地命名了容器FancyButtonContainer,以强调它是一个“事物”——容器作为“事物”的身份(因此存在!)有时会在速记中丢失
export default connect(...)
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
大多数示例中显示的语法