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