Как вложить функциональность FieldArray в другой компонент <FieldArray> с помощью React-final-form

В приложении, которое я разрабатываю, есть модуль для проведения опросов / опросов. Бэкэнд уже был запрограммирован, и в основном есть конечная точка, которая принимает сложный объект в теле, а затем будет строить опрос. Сложный объект может варьироваться в зависимости от типа опроса и типа вопроса, некоторые из них имеют множественный выбор, а некоторые - голоса, а некоторые являются открытыми. Примером этого сложного объекта я пытаюсь построить LOOS, как это:

{
  "title": "Newish first poll",
  "description": "juan's first wizard poll",
  "status": "new",
  "start_date": "2019-03-12 08:00:00",
  "end_date": "2019-03-25 08:00:00",
  "questions" : [
    {
        "question_text":"HOW CAN DIS BE",
        "type":"1",
        "choices": []
    },
    {
        "question_text":"Choose your weapon",
        "type":"0",
        "choices": [
            {
                "choice_text": "Sword",
                "description": "Sharp and durable, the sword is very popular."
            },
            {
                "choice_text": "Hammer",
                "description": "Stop!"
            },
            {
                "choice_text": "Poetry",
                "description": "Nothing more devastating than a poetry slam"
            }
        ]
    },
    {
        "question_text":"Do you agree?",
        "type":"1"
    }
  ]
}

Таким образом, по существу, объект имеет fieldArray, называемый вопросами, который содержит объекты вопросов. Однако эти объекты вопросов могут также содержать массивы вариантов выбора, если это вопрос с несколькими вариантами ответов, и каждый вариант имеет 2 потенциальных поля, текст выбора и описание выбора.

В общих чертах, используя только массив из одного поля и доступную мутацию, я могу выдвинуть объект полного вопроса, в настоящее время жестко закодированный в переменную, передаваемую так: push('questions',sampleQuestion1) при нажатии на кнопку.

Поскольку массив вопросов уже содержит массив choices[], то форма будет работать, однако я не могу отобразить значения массива choices внутри других так же, как с верхним уровнем FieldArray.

Вот как выглядит базовая реализация

<FieldArray name='questions'>
    {({fields})=>(
        <div>
            {fields.map((question,i)=>(
                <div key={i}>
                    <div className={'form-group'}>
                        <InputField name={`${question}.question_text`} placeholder={'Pregunta'} disabled/>
                        <FieldArray name={'choices'}>
                            {({fields})=>(
                                //i would like to be able to map through fields of the choices array, if present
                            )}
                        </FieldArray>
                    </div>
                </div>
            ))}
        </div>
    )}
</FieldArray>

Я попытался вставить компонент внутри другого полевого массива, это, конечно, довольно наивно, и я быстро обнаружил, что push-мутатор уже был вызван с добавленными данными, и что я не могу отобразить поля выбора, поскольку объект вопроса прошел в родитель fields.map на самом деле не является объектом вопроса как таковым.

Я попробовал несколько других методов и был прочитан в документации, но я немного озадачен. Если бы кто-нибудь мог помочь мне понять, возможно ли это, я был бы очень признателен

1 ответ

Я думаю, что вы не понимаете, что FieldArray это для. FieldArray это когда ваши данные (то, что отправляет форма) состоят из массива , длина которого может быть изменена пользователем. У вас есть массив вопросов, которые вы хотите отобразить в полях. Вы должны просто отобразить их и визуализировать поля.

Что-то вроде этого:

<form>
  {questions.map((question, index) => (
    <label>{question.question_text}</label>
    {question.type === 1 && <Field name={`answers[${index}]`} component="input" type="checkbox"/>}
    {question.type === 0 && <Field name={`answers[${index}]`} component="select">
       {question.choices.map(choice => <option>{choice.choice_text}</option>}
     </Field>}
  ))}
</form>

Я не могу гарантировать, что это скомпилируется, но это должно дать вам общее представление. При отправке данные формы продукта будут иметь массив answers чьи индексы соответствуют questions массив.

Это помогает?

Другие вопросы по тегам