【发布时间】:2016-09-29 02:32:53
【问题描述】:
在进行 Ajax 调用的 redux-form handleSubmit 函数中,Ajax 中需要一些来自 Redux 状态的属性(例如用户 ID)。
如果我想在表单的组件中定义handleSubmit,这很容易:只需调用mapStateToProps 传递我需要的任何内容,然后从this.props 中的handleSubmit 中读取它。
但是,像一个优秀的 React-Redux 开发人员一样,我编写单独的视图组件和容器,所以我的视图组件可以很简单,几乎没有行为。因此,我想在我的容器中定义 handleSubmit。
再一次,很简单——redux-form 就是为了做到这一点而设置的。在mapDispatchToProps中定义一个onSubmit,表单会自动调用。
除了,哦,等等,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 recommends against using mergeProps (for performance reasons),所以这似乎不是最理想的。
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 将 state 属性复制到 redux-form 字段中,这些字段不会映射到表单组件中的任何输入控件。这将确保它们可以在传递回handleSubmit 的values 参数中访问。这似乎是一种 hack。
一定有更好的方法!
有没有更好的方法?
【问题讨论】:
标签: reactjs redux react-redux redux-form