使用来自 redux-forms "onSubmit" 的 dispatch 分离 API 调用

Posted

技术标签:

【中文标题】使用来自 redux-forms "onSubmit" 的 dispatch 分离 API 调用【英文标题】:Separate API calls using dispatch from redux-forms "onSubmit" 【发布时间】:2017-05-25 05:06:08 【问题描述】:

我按照文档的建议集成了 redux-form,一切正常。 下一步我想将异步 API 调用添加到我的应用程序中,并将它们与redux-form 创建的表单结合起来。

像往常一样,我想将我的 ui 组件与应用程序逻辑分开。 redux 这样做的方式是在组件中调度操作并在 reducer 中执行必要的逻辑。当您需要在您的操作/actionCreators 中进行异步操作时,可以使用 redux-thunk 或其他库,例如 redux-saga

假设我想使用 redux-thunk 在我的 actionCreators 中使用异步 api 调用来更新我的应用程序状态。现在的问题是,有人如何将它与redux-formonSubmit 函数中给我们的逻辑结合起来?此函数假定您返回一个处理表单状态的承诺,但我找不到将其与使用操作的通常方式相结合的方法。

redux-form 不是提供了一种使用操作来处理提交功能的简化方法吗?

如果有不清楚的地方,或者您需要一些代码来更清楚地了解我想要实现的目标,请随时提出任何问题。谢谢!

【问题讨论】:

【参考方案1】:

Redux-form 允许你传入一个提交处理程序属性,你可以在其他地方使用它。

一种可能的方法。

您的父组件

class FormHandler extends Component 
  constructor(props) 
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  
  handleSubmit(data) 
    return this.props.asyncAction(data).then(() => 
      throw new SubmissionError( user: 'Username already taken.', _error: 'Form submission failed' );
    
  
  render() 
    return <MyForm onSubmit=this.handleSubmit />
  


export default connect(mapStateToProps,  asyncAction )(FormHandler);

你可以连接你的父组件,就像你通常没有 redux-form 一样,handleSubmit 可以是一个连接到你的商店的动作。

您可以在 Redux form official documentation 上找到有关提交验证的更多信息。

你的 redux-form MyForm

class MyForm extends Component 
  render() 
    const  error, handleSubmit, onSubmit, submitting  = this.props;

    return (
      <form onSubmit=handleSubmit(onSubmit)>
          ... fields ...
          <button type="submit" disabled=submitting>Create</button>
      </form>
    );
  


MyForm.PropTypes = 
  onSubmit: PropTypes.func.isRequired
;

export default reduxForm(
  form: 'myForm',
)(MyForm);

【讨论】:

谢谢。这就是我现在正在做的方式。我对您将父组件的handleSubmit 函数与异步提交验证(您需要在handleSubmit 函数中返回一个promise)与使用副作用绑定到redux-store 的API 调用连接的方式感兴趣喜欢redux-thunkredux-thunk actionCreators 需要返回一个带有 dispatch 作为 props 的函数。 @choise 查看我的编辑。我添加了一个非常完整的父级示例,包括react-redux 连接和对官方文档验证的引用。如果您不使用react-redux,只需像往常一样发送操作,这不会改变。

以上是关于使用来自 redux-forms "onSubmit" 的 dispatch 分离 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Redux-Form 进行搜索过滤器,如何“重置”并重新提交表单?

如何使用 redux-form 在不同组件(向上一个组件)中显示 FieldArray 中的字段

如何通过 redux-persist 阻止 redux-form “form”状态自动再水化

在 React、Redux-Form 和 GraphQL 中选择输入中的 onChange 事件从数据库中查询

如何通过重新选择使用 redux-form

Redux-Form 基础使用