主要讲添加和编辑用同一个Form.list表单,来回切换并且改变此表单的默认展示几项

相信大家用过antdesign中的Form.list时候都会遇到一个问题吧,就是怎么默认值显示一项?

然后再网上也搜了很多方法,结果还是没有达到自己想要的效果。

在这里有一个坑,大家肯定都踩过,我们再Form.list中的属性发现一个initialValue(默认值)  

initialValue的用法:

          <Form
            name="dynamic_form_nest_item"
            onFinish={onFinish}
            form={form}
            // style={{ maxWidth: 600 }}
            style={{ width: '100%' }}
            autoComplete="off"
          >
            <Form.List name="users" initialValue={[{}]}>    
              {(fields, { add, remove }) => (
                <>
                  {fields.map(({ key, name, ...restField }) => (
                    <div
                      key={key}
                      style={{ display: 'flex', marginBottom: 8, flexWrap: 'wrap', width: '100%' }}
                    >
                      <Form.Item
                        style={{ width: '100%' }}
                        {...restField}
                        label={'证书信息'}
                        name={[name, 'name']}
                        rules={[{ required: true, message: 'Missing last name' }]}
                      >
                        <Input placeholder="证书名称" />
                      </Form.Item>
                      <Button
                        type="primary"
                        style={{ marginTop: '130px', marginLeft: '-230px' }}
                        onClick={() => remove(name)}
                        danger
                      >
                        <MinusCircleOutlined />
                        删除
                      </Button>
                    </div>
                  ))}
                  <Form.Item style={{ width: '15%', marginTop: '-40px' }}>
                    <Button
                      type="primary"
                      onClick={() => {
                        addss(fields);
                        add();
                      }}
                      block
                      icon={<PlusOutlined />}
                    >
                      新建
                    </Button>
                  </Form.Item>
                </>
              )}
            </Form.List>
            <Form.Item>
              <Button type="primary" htmlType="submit">
                确认
              </Button>{' '}
              <Button>取消</Button>
            </Form.Item>
          </Form>

配合Form.list使用,他的格式是一个数组包多个对象,有几个对象就默认展示几项,非常方便,但是呢这个属性他有一个弊端,当我们,已经给initialValue赋值一次之后可以再次赋值,但是这个initialValue默认值就无法再改变了,除非刷新,希望大家明白默认值的意思。

       
const [data,setData] = useState([{}])
<Form.List name="users" initialValue={data} />

setData([{},{}])   //不行

let array = data
setData([...array])  //也不行   

总之各种方法都不行,就在我屋头闷水的时候想到了一个方案,不知道大家有没有注意到表单中的fields表单展示几项都和他息息相关,竟然都是围绕这他来进行增加和删除的,那么我们可以把他换成我们自己创建的一个变量啊,然后对这个变量进行操作!

  const [number, setNumber] = useState([{}]);

此时我们就不用Form.list了,用map循环。

        <Form
          name="dynamic_form_nest_item"
          onFinish={onFinish}
          onFinishFailed={onFinishFailed}
          form={form}
          // style={{ maxWidth: 600 }}
          style={{ width: '100%' }}
          autoComplete="off"
        >
          {/* <Form.List name="users">
            {(fields, { add, remove }) => ( */}
          <>
            {number.map((key, name) => (
              <div
                key={name}
                style={{ display: 'flex', marginBottom: 8, flexWrap: 'wrap', width: '100%' }}
              >
                <Form.Item
                  style={{ width: '100%' }}
                  label={'证书信息'}
                  name={[name, name + 'name']}
                  rules={[{ required: true, message: 'Missing last name' }]}
                >
                  <Input placeholder="证书名称" />
                </Form.Item>
                <Button
                  type="primary"
                  style={{ marginTop: '130px', marginLeft: '-230px' }}
                  // onClick={() => remove(name)}
                  danger
                >
                  <MinusCircleOutlined />
                  删除
                </Button>
              </div>
            ))}
            <Form.Item style={{ width: '15%', marginTop: '-40px' }}>
              <Button
                type="primary"
                onClick={() => {
                  addss();
                  // add();
                }}
                block
                icon={<PlusOutlined />}
              >
                新建
              </Button>
            </Form.Item>
          </>
          {/* )} */}
          {/* </Form.List> */}
          <Form.Item>
            <Button type="primary" htmlType="submit">
              确认
            </Button>{' '}
            <Button>取消</Button>
          </Form.Item>
        </Form>

 如果想要新增一项只需要给number加上一个空对象就行了,删除,同理删除一个对象

下期讲如何回显数据,这和name={[name, name + 'name']}息息相关

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐