在进行 Ajax 调用的 redux-formhandleSubmit
函数中,Ajax 中需要一些来自 Redux 状态的属性(例如用户 ID)。
如果我想在表单的组件中定义这将很容易handleSubmit
:只需调用mapStateToProps
传入我需要的任何内容,然后从this.props
我的handleSubmit
.
但是,就像一个优秀的 React-Redux 开发人员一样,我编写了单独的视图组件和容器,因此我的视图组件可以很简单,几乎没有行为。因此,我想在我的容器中定义 handleSubmit。
再次,简单的 - redux-form 被设置为做到这一点。定义一个onSubmit
in mapDispatchToProps
,表单会自动调用它。
除了,哦等等,mapDispatchToProps
没有办法访问 redux 状态。
好的,没问题,我只需将我需要的道具handleSubmit
与表单值一起传递。
嗯,等等,使用这种机制是不可能传递任何数据的handleSubmit
!你得到一个参数,values
,并且没有办法添加另一个参数。
这留下了以下没有吸引力的替代方案(我可以验证 1 和 2 是否有效):
1在表单组件中定义一个提交处理程序,并从那里调用从 mapDispatchToProps 传入的我自己的自定义提交处理程序函数。这没关系,但需要我的组件知道一些来自 redux 状态的道具,这些道具不需要显示表单。(这个问题不是 redux-form 独有的。)
dumbSubmit(values)
{
const { mySubmitHandler, user} = this.props;
mySubmitHandler(values, user);
}
<form onSubmit={ handleSubmit(this.dumbSubmit.bind(this)) }>
或者,更简洁地说,这都可以组合成一个箭头函数:
<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props.user);}
然后为了使这个处理程序完全不可知,它可以将整个 this.props 传回自定义处理程序:
<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props);}
2在mergeProps 中定义onSubmit而不是mapDispatchToProps,这样就可以访问stateProps。Dan Abramov 建议不要使用 mergeProps(出于性能原因),所以这似乎不是最理想的。
function mergeProps(stateProps, dispatchProps, ownProps) {
const { user } = stateProps.authReducer;
const { dispatch } = dispatchProps;
return {
...ownProps,
...dispatchProps,
...stateProps,
onSubmit: (values) => {
const { name, description } = values;
const thing = new Thing(name, description, []);
dispatch(createNewThing(thing, user.id));
}
}
3将状态属性复制到未映射到表单组件中的任何输入控件的redux-form 字段中。这将确保它们可以在values
传递回的参数中访问handleSubmit
。这似乎是一种黑客行为。
一定有更好的办法!
有没有更好的办法?