Как показать первый элемент по умолчанию в динамической форме Antd?

Наверное, для кого-то это несложно. В документации по формам AntD и демонстрации здесь их демо начинается без полей. Вы должны нажать кнопку «+ Добавить поле», чтобы динамическая форма добавила и отобразила первое поле, как показано здесь.

введите здесь описание изображения

Если я хочу, чтобы все началось с отображения первого поля без необходимости сначала нажимать кнопку «+ Добавить поле», как это сделать? Похоже, мне нужно как-то вызвать функцию добавления при рендеринге? В любом случае я ищу, чтобы он показывал первому пассажиру, когда он изначально загружает форму, как на этом снимке экрана, после того, как я нажал кнопку «Добавить поле».

введите здесь описание изображения

Другими словами, я хочу, чтобы всегда был как минимум 1 пассажир.

Их демонстрационный код можно посмотреть по ссылке выше, которая приведет вас прямо к их документации, но и здесь:

import { Form, Input, Button } from 'antd';
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';

const formItemLayout = {
  labelCol: {
    xs: { span: 24 },
    sm: { span: 4 },
  },
  wrapperCol: {
    xs: { span: 24 },
    sm: { span: 20 },
  },
};
const formItemLayoutWithOutLabel = {
  wrapperCol: {
    xs: { span: 24, offset: 0 },
    sm: { span: 20, offset: 4 },
  },
};

const DynamicFieldSet = () => {
  const onFinish = values => {
    console.log('Received values of form:', values);
  };

  return (
    <Form name="dynamic_form_item" {...formItemLayoutWithOutLabel} onFinish={onFinish}>
      <Form.List name="names">
        {(fields, { add, remove }) => {
          return (
            <div>
              {fields.map((field, index) => (
                <Form.Item
                  {...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
                  label={index === 0 ? 'Passengers' : ''}
                  required={false}
                  key={field.key}
                >
                  <Form.Item
                    {...field}
                    validateTrigger={['onChange', 'onBlur']}
                    rules={[
                      {
                        required: true,
                        whitespace: true,
                        message: "Please input passenger's name or delete this field.",
                      },
                    ]}
                    noStyle
                  >
                    <Input placeholder="passenger name" style={{ width: '60%' }} />
                  </Form.Item>
                  {fields.length > 1 ? (
                    <MinusCircleOutlined
                      className="dynamic-delete-button"
                      style={{ margin: '0 8px' }}
                      onClick={() => {
                        remove(field.name);
                      }}
                    />
                  ) : null}
                </Form.Item>
              ))}
              <Form.Item>
                <Button
                  type="dashed"
                  onClick={() => {
                    add();
                  }}
                  style={{ width: '60%' }}
                >
                  <PlusOutlined /> Add field
                </Button>
              </Form.Item>
            </div>
          );
        }}
      </Form.List>

      <Form.Item>
        <Button type="primary" htmlType="submit">
          Submit
        </Button>
      </Form.Item>
    </Form>
  );
};

ReactDOM.render(<DynamicFieldSet />, mountNode);
.dynamic-delete-button {
  cursor: pointer;
  position: relative;
  top: 4px;
  font-size: 24px;
  color: #999;
  transition: all 0.3s;
}
.dynamic-delete-button:hover {
  color: #777;
}
.dynamic-delete-button[disabled] {
  cursor: not-allowed;
  opacity: 0.5;
}

person Gerald Wichmann    schedule 16.05.2020    source источник


Ответы (1)


вы можете использовать initialValues prop. взгляните на этот пример:

https://codesandbox.io/s/dynamic-form-item-ant-design-demo-qm1d8

person Hamid Sarani    schedule 16.05.2020
comment
Ах, интересно, когда он используется в теге Form, он, по сути, выполняет это. Я использовал его в теге Form.Item для другой цели (чтобы убедиться, что одно из моих необязательных полей не пустое), но это не имело такого же эффекта. Очень полезный! - person Gerald Wichmann; 16.05.2020