reactjs - 具有自创建输入的 Redux 表单

标签 reactjs redux redux-form

我正在尝试创建一个 redux 表单(使用 redux-form),它可以动态创建自己的输入。我无法弄清楚如何使 redux-form 知道已创建的新字段。是否可以动态更改 redux-form 在表单组件本身中传入的 fields 属性?我这个想法是不是错了?这是我正在处理的内容。

class AddCustomer extends Component {

 render() {

  class Form extends Component {

    constructor(props, context) {
      super(props, context)
      this.state = {
        inputsToAdd: []
      };
    }

    handleAddInput() {
       let inputsToAdd = this.state.inputsToAdd.slice();
       inputsToAdd.push(this.state.inputsToAdd.length);
       this.setState({ inputsToAdd });
    }

    submitForm(data) {
       console.log(data)
       this.setState({inputsToAdd: []});
       this.props.dispatch(initialize('addCustomer', {}))
    }

    render() {
      const { fields, handleSubmit } = this.props;
      return (
          <div>
            <form onSubmit={handleSubmit(this.submitForm.bind(this))}>
              <Input type='text' label='Company name' {...fields['companyName']}/>
              <Input type='email' label='Admin user email' {...fields['adminEmail']}/>
            </form>
            {this.state.inputsToAdd.map((element, index) => {
              return (
                <Input key={index} type='text' />
              )
            })}
            <Button onClick={() => this.handleAddInput()}>Add Input</Button>
            <Button onClick={handleSubmit(this.submitForm.bind(this))}>Submit</Button>
          </div>
        )
      }
    }

    Form = connectReduxForm({
      form: 'addCustomer',
      fields: ['companyName', 'adminEmail']
    })(Form);

    return (
      <div>
        <h1>Add Customer</h1>
        <Form />
      </div>
    )
  }
}

最佳答案

从 Redux Form 6.* 开始,您可以使用 <FieldArray/> 来实现您想要做的事情。

请参阅下面的示例(取自 Redux 文档并稍作简化)

import React from 'react'
import { Field, FieldArray, reduxForm } from 'redux-form'
import validate from './validate'

const renderMembers = ({ fields, meta: { touched, error } }) => (
  <ul>
    <li>
      <button type="button" onClick={() => fields.push({})}>Add Member</button>
      {touched && error && <span>{error}</span>}
    </li>
    {fields.map((member, index) =>
      <li key={index}>
        <button
          type="button"
          title="Remove Member"
          onClick={() => fields.remove(index)}/>
        <h4>Member #{index + 1}</h4>
        <Field
          name={`${member}.firstName`}
          type="text"
          component={renderField}
          label="First Name"/>
        <Field
          name={`${member}.lastName`}
          type="text"
          component={renderField}
          label="Last Name"/>

      </li>
    )}
  </ul>
)


const FieldArraysForm = (props) => {
const { handleSubmit, submitting } = props
  return (
    <form onSubmit={handleSubmit}>
      <FieldArray name="members" component={renderMembers}/>
      <div>
        <button type="submit" disabled={submitting}>Submit</button>
      </div>
    </form>
  )
}

export default reduxForm({
  form: 'fieldArrays',     // a unique identifier for this form
  validate
})(FieldArraysForm)

有关更多信息,请查看文档 http://redux-form.com/6.1.1/examples/fieldArrays/

关于reactjs - 具有自创建输入的 Redux 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34026301/

相关文章:

javascript - React forwardRef HoC 没有引用容器元素

javascript - componentDidMount 最初不呈现我的数据,仅在 componentDidUpdate 上呈现

javascript - Redux thunk 在下一个 Action 之前未解析 + then 不是函数或分派(dispatch)未定义

reactjs - redux-form getFormState 副作用

javascript - 使用ajax发送带有嵌套在列表中的文件的json

javascript - 如何从 Ant design 的 Select/Option 组件中获取值

javascript - 如何在 Office UI Fabric React 中设置 dialogDefaultMaxWidth?

javascript - React with Redux Warning : Failed propType: Required prop `posts` was not specified in `Posts` . 检查 `PostsContainer`的render方法

javascript - 使用 React Redux 创建帖子

reactjs - Redux Forms 有时会导致注册/取消注册无限循环