如何使用 redux-form 处理提交

IT技术 reactjs redux react-redux redux-form
2021-05-17 19:21:05

我正在努力第一次使用 redux-form。我能够呈现表单,但我无法处理提交。虽然我最终想将数据发送到服务器,但此时,我只是尝试控制台记录表单字段值。我收到错误:

Error: You must either pass handleSubmit() an onSubmit function or pass onSubmit as a prop

这是我的 Profile.jsx 文件

import React, {Component} from 'react';
import {connect} from 'react-redux';
import {withAuth} from 'react-devise';
import { Field, reduxForm } from 'redux-form';

class Profile extends Component {
  handleSubmit(data) {
     console.log('Submission received!', data);
   }
  render() {
    const { handleSubmit } = this.props;
    return (
      <form onSubmit={handleSubmit}>
        <div>
          <label htmlFor="firstName">First Name</label>
          <Field name="firstName" component="input" type="text"/>
        </div>
        <div>
          <label htmlFor="lastName">Last Name</label>
          <Field name="lastName" component="input" type="text"/>
        </div>
        <div>
          <label htmlFor="email">Email</label>
          <Field name="email" component="input" type="email"/>
        </div>
        <button type="submit">Submit</button>
      </form>
    );
  }
}

// Decorate the form component
Profile = reduxForm({
  form: 'profile' // a unique name for this form
})(Profile);


const mapStateToProps = state => {
  return {
    currentUser: state.currentUser
  };
};

export default connect(mapStateToProps)(withAuth(Profile));

我如何以最终可以将它们发送到我的 API 的方式处理提交的值?

2个回答

Redux-Form 用handleSubmitprop装饰你的组件根据文档,它是:

旨在传递给<form onSubmit={handleSubmit}>的函数<button onClick={handleSubmit}>它将运行同步和异步验证,并且,如果表单有效,它将this.props.onSubmit(data)使用表单数据的内容进行调用

或者,您也可以将您的onSubmit函数传递handleSubmit 它来代替onSubmitprops。例如:

因此,如果您的组件没有onSubmit属性,则必须“手动”将提交处理程序传递给handleSubmit函数。请试试这个:

<form onSubmit={this.props.handleSubmit(this.handleSubmit.bind(this))}>

请不要将您的handleSubmit方法与从 Redux-Form 传递的同名props混淆

(代题作者贴出答案移至答案空间)

工作代码:

import React, {Component} from 'react';
import {connect} from 'react-redux';
import {withAuth} from 'react-devise';
import { Field, reduxForm } from 'redux-form';

class Profile extends Component {
  handleSubmit(data) {
     console.log('Submission received!', data);
   }
  render() {
    return (
      <form onSubmit={this.props.handleSubmit(this.handleSubmit.bind(this))}>
        <div>
          <label htmlFor="firstName">First Name</label>
          <Field name="firstName" component="input" type="text"/>
        </div>
        <div>
          <label htmlFor="lastName">Last Name</label>
          <Field name="lastName" component="input" type="text"/>
        </div>
        <div>
          <label htmlFor="email">Email</label>
          <Field name="email" component="input" type="email"/>
        </div>
        <button type="submit">Submit</button>
      </form>
    );
  }
}

// Decorate the form component
Profile = reduxForm({
  form: 'profile' // a unique name for this form
})(Profile);


const mapStateToProps = state => {
  return {
    currentUser: state.currentUser
  };
};

export default connect(mapStateToProps)(withAuth(Profile));