Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to show the first item by default in a dynamic Antd form?

This is probably an easy one for someone. In AntD's forms documentation and demo here, their demo starts with no fields. You have to click the "+ Add Field" button for the dynamic form to add and show the first field as shown here..

enter image description here

If I want it to start out by showing the first field without having to first click the "+ Add Field" button, how is that done? Seems like I'd need to somehow call the add function upon render? Anyways I'm looking for it to show the first passenger when it initially loads the form such as in this screenshot after i've pressed the Add Field button..

enter image description here

Put another way, I want there always to be a minimum of 1 passenger.

Their demo's code can be viewed in the link above that takes you right to their documentation but here it is as well:

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;
}
like image 715
Gerald Wichmann Avatar asked May 16 '20 00:05

Gerald Wichmann


2 Answers

you can use initialValues prop. take look at this example:

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

like image 137
Hamid Sarani Avatar answered Oct 03 '22 05:10

Hamid Sarani


If you set initialValues for Form component as @HamidSarani pointed, it will automatically add needed number of fields. Just, don't put an empty string, like in his example, because you'll not have placeholder shown. Set it as undefined instead. That way, placeholder will be displayed as well.

<Form initalValues={{names: [undefined]}}>
like image 37
Aleksandar Stojilkovic Avatar answered Oct 03 '22 03:10

Aleksandar Stojilkovic