Динамическая форма ANTD - начальные значения

У меня проблема с установкой начальных значений для динамической формы antd. Есть ли способ, как динамически инициализировать значения для. Требуется зарегистрированное поле с использованием getFieldDecorator. Но для динамических полей это поле раньше не регистрировалось.

Я получаю эту ошибку: You cannot set field before registering it.

код: https://codesandbox.io/s/jnx3p1nz5

import React from "react";
import { Select, Icon, Button, Form, Input } from "antd";

const FormItem = Form.Item;
const TextArea = Input.TextArea;
const Option = Select.Option;

const SELECT = ['opt1', 'opt2'];

class TestForm extends React.Component {
  state = {
    listKeys: [0]
  };

  componentDidMount() {
    const {
      form: { setFieldsValue }
    } = this.props;


    // WORK
    // setFieldsValue({
    //   name: 'test',
    // });

    // setFieldsValue({
    //   name: 'test',
    //   list: [
    //     {
    //       sub1: 'test1',
    //       sub2: 'test2',
    //     }
    //   ]
    // });

    // !!!!!!!!!!!! NOT WORK
    // setFieldsValue({
    //   name: 'test',
    //   list: [
    //     {
    //       sub1: 'test1',
    //       sub2: 'opt2'
    //     },
    //     {
    //       sub1: 'test11',
    //       sub2: 'opt1'
    //     }
    //   ]
    // });

    setFieldsValue({
      name: 'test',
      list: [
        {
          sub1: 'test1',
          sub2: 'opt2',
          opt2sub: 'bla',
        },
        {
          sub1: 'test11',
          sub2: 'opt1'
        },
        {
          sub1: 'test3',
          sub2: 'opt2',
          opt2sub: 'bla',
        },
      ]
    });
  }

  remove = k => {
    const { listKeys } = this.state;

    if (listKeys.length === 1) {
      return;
    }

    this.setState({
      listKeys: listKeys.filter(key => key !== k)
    });
  };

  add = () => {
    const { listKeys } = this.state;

    this.setState({
      listKeys: [...listKeys, listKeys.length]
    });
  };

  render() {
    const {
      form: { getFieldDecorator, getFieldValue }
    } = this.props;
    const { listKeys } = this.state;

    return (
      <Form onSubmit = {this.handleSubmit}>
        <FormItem label = "Name">
          {getFieldDecorator("name")(<Input placeholder = "name" />)}
        </FormItem>
        {listKeys.map((key, index) => {
          const type = getFieldValue(`list[${key}].sub2`);

          return (
            <div key = {key}>
              <FormItem label = "Sub1">
                {getFieldDecorator(`list[${key}].sub1`)(
                  <Input placeholder = "Sub1" />
                )}
              </FormItem>
              <FormItem label = "Sub2">
                {getFieldDecorator(`list[${key}].sub2`,{
                  initialValue: 'opt1'
                })(
                  <Select>
                    {SELECT.map(item => <Option key = {item} value = {item}>{item}</Option> )}
                  </Select>
                )}
              </FormItem>
              {type === 'opt2' && (
                <FormItem label = "opt2sub">
                  {getFieldDecorator(`list[${key}].opt2sub`)(
                    <Input placeholder = "opt2sub" />
                  )}
                </FormItem>
              )}
              {index > 0 && (
                <Icon
                  className = "dynamic-delete-button"
                  type = "minus-circle-o"
                  onClick = {() => this.remove(key)}
                />
              )}
            </div>
          );
        })}
        <FormItem>
          <Button type = "dashed" onClick = {this.add}>
            <Icon type = "plus" />Add field
          </Button>
        </FormItem>
        <FormItem>
          <Button type = "primary" htmlType = "submit">
            Submit
          </Button>
        </FormItem>
      </Form>
    );
  }
}

export default Form.create()(TestForm);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
7 545
2

Ответы 2

Вы всегда должны регистрировать поле, прежде чем сможете его использовать. Здесь я предлагаю вам установить состояние со списком в componentDidMount, а затем использовать initialValue для установки значения в рендере. Например

componentDidMount() {
  const {
    form: { setFieldsValue },
    listKeys,
  } = this.props;
  this.setState({listKeys})
}

render() {
  <FormItem label = "Sub1">
    {getFieldDecorator(`list[${key}].sub1`, {initialValue: this.props.list[key].sub1})(
      <Input placeholder = "Sub1" />
    )}
  </FormItem>
}

Вы можете использовать forceRender = {true} в опоре, которая содержит форму для ее рендеринга. У меня была форма внутри ящика. Для этого у меня была такая же ошибка. Я использовал forceRender = {true} в стойке ящика. Итак, что бы ни удерживало форму, вам необходимо отрендерить ее с помощью forceRender.

Большое спасибо. Также был в большой борьбе с моим ящиком! Отлично!!!!!

C4d 08.12.2020 17:54

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