尝试将 redux-form 与功能组件重用

Kla*_*ton 4 javascript components reactjs redux-form

我正在尝试构建一个可重用的组件来创建简单的表单,进行验证并处理提交操作。我可以自己使用它,但是当我尝试制作一个功能组件来注入道具时,我陷入了这个错误。

在此输入图像描述

该类使用组件来构建表单

import React from 'react';
import CustomReduxForm from './CustomReduxForm';

class LoginForm extends React.Component {
  getFields() {
    return [
      {
        name : 'username',
        type : 'text',
        label : 'User',
        mandatory : true
      },
      {
        name : 'password',
        type : 'password',
        label : 'Password',
        mandatory : true
      }
    ];
  }

  handleFormSubmit(values) {
    console.log(values)
  }

  render() {
    return (
      <div>
        <div>Test</div>
        <CustomReduxForm
          formName="LoginForm"
          fields={this.getFields()}
          onSubmit={this.handleFormSubmit}
        />
      </div>
    );
  }
}

export default LoginForm;
Run Code Online (Sandbox Code Playgroud)

这是构建表单的组件

import React from 'react';
import { reduxForm, Field } from 'redux-form';

function CustomReduxForm(props) {

  class CustomForm extends React.Component {
    render() {
      const { handleSubmit } = this.props;
      return (
        <div style={{ margin: '30px' }}>
          <form onSubmit={handleSubmit(props.onSubmit)}>
            {fields.map(myField => renderFieldset(myField))}
            <button className="btn btn-primary" type="submit">Submit</button>
          </form>
        </div>
      );
    }
  }

  const renderInput = field => {
    return (
        <div className={`form-group ${field.meta.touched && field.meta.invalid ? 'has-danger' : ''}`}>
          <input
            {...field.input}
            type={field.type}
            className="form-control"
          />

          {field.meta.touched && field.meta.error && <div className="text-help">{field.meta.error}</div>}
       </div>
    );
  }

  const renderFieldset = customField => {
      return (
        <div>
          <label htmlFor={customField.name}>{customField.label}</label>
          <Field
            name={customField.name}
            component={renderInput}
            type={customField.type} />
        </div>
      );
  }

  const validate = values => {
    const errors = {}

    props.fields.forEach((customField) =>
    {
      if(customField.mandatory && ! values[customField.name]) {
        errors[customField.name] = `You must enter a valid value for ${customField.label}!`;
      }
    });

    return errors
  }

  return reduxForm({
    form: props.formName,
    validate
  })(CustomForm);

};

export default CustomReduxForm;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了不同的方法来导出 CustomReduxForm 上创建的表单,但仍然一无所获!

return reduxForm({
  form: props.formName,
  validate
})(CustomForm);

// or

const FormWrapped = reduxForm({
  form: props.formName,
  validate
})(CustomForm);

// Non sense, but ..
return FormWrapped;

// or
return <FormWrapped />;
Run Code Online (Sandbox Code Playgroud)

谢谢!

jpd*_*rre 5

问题是 的 return 语句CustomReduxForm

正确的方法是将其分配给一个变量并使用 JSX 语法,就像您在上一个片段中所做的那样。

const WrappedForm = reduxForm(...)(CustomForm);
return <WrappedForm />
Run Code Online (Sandbox Code Playgroud)

你唯一错过的就是将 的 props 传递CustomReduxFormWrappedForm.

你需要使用return <WrappedForm {...props} />

现在的问题是修复代码中的其他错误,例如......

const { fields, handleSubmit } = this.props

而不是使用const renderFieldset和做{fields.map(myFieldset => renderFieldset(myFieldset)

const Fieldset = ...那么你可能想使用{fields.map((myFieldset, index) => <Fieldset key={index} />)}

现在它应该按预期工作。