如何在React JS中使用Redux和Axios?

时间:2017-12-18 11:14:17

标签: javascript reactjs axios

这是我的登录页面:

class Login extends Component {

  /*define constructor for state props*/
  constructor() {
    super();

    this.state = {
      email: '',
      password: ''
    };
      this.handleSubmit = this.handleSubmit.bind(this);
      this.handleChange = this.handleChange.bind(this);
     }

     /*Define the after submit form*/
     handleSubmit(e) {
      // Stop browser from submitting the form.
      e.preventDefault();

      this.form.validateFields();

          if (!this.form.isValid()) {
            console.log("Not valid arguments");
          } else {

  This is my function for Axios post values
       Validate here or directly when setting state.
      Then send a POST request to your endpoint.

      axios.post('http//127.0.0.1:8000/user/login', {
          email: this.state.email,
          password: this.state.password
        })
        .then(function(response) {
          /*response from json*/
          console.log(response);
        })
        .catch(function(error) {
          console.log(error);
        });
      }
    }

    handleChange(e) {

      this.form.validateFields(e.currentTarget);

      this.setState({
        [e.target.name]: e.target.value
      });
    }

  render() {
    return(
      <div className="container">
      <h3 className="jumbotron">Redux Form Validation</h3>
      <FormCode onSubmit={this.submit} />
    </div>

这是我使用redux-forms

进行验证的功能

在前面定义验证

  

const validate = values =&gt; {           const errors = {}           if(!values.password){             errors.password ='必填'           } else if(values.password.length&gt; 15){             errors.password ='必须是15个字符或更少'           }           if(!values.email){             errors.email ='必需'           } else if(!/ ^ [A-Z0-9 ._%+ - ] + @ [A-Z0-9 .-] +。[AZ] {2,4} $ / i.test(values.email) ){             errors.email ='无效的电子邮件地址'           }           返回错误         }

const renderField = ({ input, label, type, meta: { touched, error, warning } }) => (
    <div>
      <label className="control-label">{label}</label>
      <div>
        <input {...input} placeholder={label} type={type} className="form-control" />
        {touched && ((error && <span className="text-danger">{error}</span>) || (warning &&
     

{警告}))}                                 )

let FormCode = props => {
  const { handleSubmit, pristine, submitting } = props;
  return (
    <form onSubmit={ handleSubmit }>
      <div className="form-group">
        <Field name="firstName" component={renderField} label="First Name" />
      </div>
      <div className="form-group">
        <Field name="lastName" component={renderField} label="Last Name" />
      </div>
      <div className="form-group">
        <Field name="email" component={renderField} label="Email" />
      </div>
      <div className="form-group">
        <button type="submit" disabled={pristine || submitting} className="btn btn-primary">Submit</button>
      </div>
    </form>
  )
}
FormCode = reduxForm({
  form: 'contact',
  validate,
})(FormCode);
export default FormCode;

我收到此错误:

  

未捕获错误:您必须将handleSubmit()传递给onSubmit   函数或传递onSubmit作为道具

2 个答案:

答案 0 :(得分:0)

试试这个:

onSubmit(values) {
    // this === component
    console.log(values);
  }

render() {
    // this is a property that is being passed to your component
    // on behalf of reduxForm
    const {handleSubmit} = this.props

    return (
      // handleSubmit takes a function that you define and you 
      // pass that to handleSubmit and it takes care of the 
      // reduxForm validation and if everything is good then it
      // will call the callback this.onSubmit and passes the values
      // out of the form to work with
      // this.onSubmit is the callback function
      <form onSubmit={handleSubmit(this.onSubmit.bind(this))}>
        <Field
          label="Title For Post"
          name="title"
          component={this.renderField}
        />
        <Field
          label="Categories"
          name="categories"
          component={this.renderField}
        />
        <Field
          label="Post Content"
          name="content"
          component={this.renderField}
        />
        <button type="submit" className="btn btn-primary">Submit</button>
      </form>
    );
  }

答案 1 :(得分:0)

上述解决方案将有效。无论如何,我想留下你的意见。

首先,您不应该使用setState和Redux的混合。如果您打算使用Redux,那么最好在Redux上处理所有应用程序的状态。

然后,在React的组件中,您应该只调用Redux的操作。假设您有一个名为loginWithEmailAndPassword的动作。你的提交功能是这样的:

handleSubmit(e) {
  e.preventDefault();

  // There is not need to pass email and password since you have
  // those values in "state".
  this.props.loginWithEmailAndPassword();
}

你的Redux行动将是这样的:

export function loginWithEmailAndPassword() {
  return (dispatch, getState) => {
    // Get email and password from state.

    return axios.post('YOUR_URL', { email, password })
      .then((success) => success && dispatch(someNextAction()));
  };
}

这是超级快写,所以我不确定它是否有效。它只是“伪代码”,解释了我如何为您的问题管理解决方案。

看看getFormValues的redux-form(https://redux-form.com/6.1.0/docs/api/selectors.md)。

希望它有所帮助。 欢呼声。