Как скрыть / показать поле в FieldArray для Redux Form v6

#reactjs #redux-form

#reactjs #redux-форма

Вопрос:

учитывая факт в примере http://redux-form.com/6.0.5/examples/fieldArrays /. Все поля визуализации.. функции находятся за пределами класса React. Следовательно, как я предполагаю использовать состояние реакции или реквизит, чтобы определить, хочу ли я скрыть или показать поле?

То, что я пытаюсь сделать, это иметь кнопку для управления состоянием, чтобы отобразить «блок» или «нет» для поля. Может кто-нибудь подсказать мне? Я попытался поместить переменную renderField внутри рендеринга класса React, однако это приводит к ошибкам.

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

1. опубликуйте то, что вы сделали до сих пор (код)?

Ответ №1:

Все реквизиты, которые передаются Field , доступны для component реквизитов.

 <Field
  name={foo}
  type="text"
  component={TextField}
  displayBlock={displayBlock}
/>



const TextField = props => {

    if(props.displayBlock) {
        ...
    }

    return (
        <div>
            <input {...props.input} />
        </div>
    );
};
  

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

1. привет! однако мое текстовое поле не отображается повторно при изменении реквизитов

Ответ №2:

Спасибо Runaground, который предложил мне ответ. Я понял, что могу передавать состояние в качестве реквизита в FieldArray, например

 <FieldArray name="histories" component={renderHistories}  openClose={this.state.openClose}/>  

Это позволяет мне использовать массив состояний из this.state.openClose, чтобы контролировать, какое поле я хотел бы скрыть или показать.

 <Field
  name={`${histories}.details`}
  type="text"
  component={renderField}
  style={{display: openClose[index] ? 'block' : 'none'}}
 />  

Однако, несмотря на то, что я могу управлять отображением поля, массив полей не отображается повторно.

Следовательно, я должен добавить две функции

 fields.push({});
setTimeout(()=>{
 fields.pop();
}, 1);  

это взято из http://redux-form.com/6.0.5/docs/api/FieldArray.md /, чтобы фактически повторно отображать fieldarray всякий раз, когда я скрываю или показываю поле. Надеюсь, есть более элегантный способ сделать это, поскольку fieldarray мерцает.