redux-форма, устанавливающая видимость поля на основе другого значения поля

#reactjs #redux #redux-form #react-redux-form

#reactjs #redux #redux-форма #react-redux-form

Вопрос:

У меня сложная форма, в которой видимость некоторых полей зависит от значения других полей. Как настройка видимости поля на основе значения другого поля выполняется в redux-form?

 const renderField = ({ input, label, type, display='flex',  meta: { touched, error } }) => (
    <div style={ { display: display }}>
      <label>{label}</label>
      <div>
        <input {...input} type={type} placeholder={label}/>
        {touched amp;amp; error amp;amp; <span>{error}</span>}
      </div>
    </div>
)



const renderMembers = ({ fields, meta: { touched, error } }) => (
  <ul>
    <li>
      <button type="button" onClick={() => fields.push({})}>Add Member</button>
      {touched amp;amp; error amp;amp; <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"/>
        <Fields names={[ `${member}.firstName`, `${member}.lastName` ]} component={renderFields}/>
        <FieldArray name={`${member}.hobbies`} component={renderHobbies}/>
      </li>
    )}
  </ul>
)
  

Ответ №1:

Предположим, что у вас есть форма с 2 полями:

 const fields = [
  'foo',
  'bar'
]
reduxForm(
{
  form: 'AwesomeForm',
  fields
}
)(AwesomeForm) 
  

Чтобы управлять видимостью поля на основе другого значения поля в <AwesomeForm/> компоненте, вы можете установить соответствующее display значение с помощью встроенных стилей. Просто сделайте проверку, которая проверяет, удовлетворяет ли другое значение необходимым условиям. Нравится:

 export const AwesomeForm = (props) => {
  return (
    <form onSubmit={props.handleSubmit}>
      <TextField
        {...props.fields.foo}     
      />
      <TextField
        {...props.fields.bar}
        style={{
          display: props.fields.name.foo === 'some value' ? 'none' : 'block',
        }}
      />

      <button
        type='submit'
        />

    </form>

  )
}
  

Комментарии:

1. Идея кажется правильной, но по какой-то причине мой <Field style={{ display: ‘none’ }} /> не скрывается

2. Я обновил свой вопрос. Если я вручную установил display:none, кажется, это работает, но игнорирует изменения в поле имени

3. Хорошо, теперь я понимаю. Мне также нужно посмотреть, как member назначается var.

4. Я играю с примером из redux-form.com/6.0.5/examples/fieldArrays обновил и мой вопрос