在mapDispatchToProps中绑定操作参数

Dav*_*ave 6 reactjs redux react-redux

我有一个提交按钮,将发送一个动作.操作的有效负载是将发送到API的发布数据.目前我使用bindActionCreatorsmapDispatchToProps:

const mapDispatchToProps = (dispatch) => ({
    actions:  bindActionCreators(FormActions, dispatch)
});
Run Code Online (Sandbox Code Playgroud)

然后在我的组件中,我绑定onClick到提交操作:

<input type="submit" onClick={() => this.props.actions.submit(this.props.postData)} />
Run Code Online (Sandbox Code Playgroud)

我不喜欢我必须给这个组件提供帖子数据mapStateToProps.我更愿意给组件一个已经将post数据绑定到submit函数的动作,所以它的用法如下所示:

<input type="submit" onClick={this.props.submit} />
Run Code Online (Sandbox Code Playgroud)

这可能吗?我无法访问该州mapDispatchToProps

fku*_*kov 5

有一个叫第三个参数mergePropsconnect方法react-redux这是应该像一个你刚才所描述的情况下使用.在您的情况下,您可以执行以下操作:

const mapStateToProps = state => ({ postData: ... });

const mapDispatchToProps = (dispatch) => ({
  actions:  bindActionCreators(FormActions, dispatch)
});

const mergeProps = (stateProps, dispatchProps) => ({
  submit: () => dispatchProps.actions.submit(stateProps.postData),
});

const ConnectedComponent = connect(mapStateToProps, mapDispatchToProps, mergeProps)(Component);
Run Code Online (Sandbox Code Playgroud)

需要注意的是组件将不会收到actions,也没有postData,只是submit.

  • 请注意,通常不鼓励使用`mergeProps`,因为它对性能有害.它会在每次商店更改时重新创建函数,从而导致组件每次都重新渲染. (5认同)
  • 几件事.首先,它是`mapDispatch`,而不是`mapState`.其次,如果传入`mergeProps`,并在`mergeProps`中声明一个func,它将是一个新的函数引用_每次`mergeProps` runs_,而`mapDispatch`只在comp初始化运行一次(或者当道具时)如果使用了两个arg形式的`mapDispatch`,则更改.(我可能错了,但99%肯定这是实际行为.) (2认同)