antd如何实现动态新增/删除表单项(详解)

目标效果:

需求分解:

1. 可通过输入框右侧图标动态新增或移除表单项

2. 单独设置最后行的help和第一行label

3. 每个输入框均有输入校验

需求实现:

使用antd里Form表单的动态增减表单项动态增减嵌套字段

地址附上:表单 Form - Ant Design

提炼后代码如下:

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

const App = () => {
    const onFinish = (values) => {
        console.log('Received values of form:', values)
    }
    return (
        <Form name="dynamic_form_item" onFinish={onFinish}>
            <Form.List name="names">
                {(fields, { add, remove }, { errors }) => (
                    <>
                        {fields.map((field, index) => (
                            <Form.Item
                                label={index === 0 ? 'Passengers' : ''}
                                required={false}
                                key={field.key}
                            >
                                <Form.Item name={field.name} key={field.key}>
                                    <Input />
                                </Form.Item>
                                {
                                    <MinusCircleOutlined
                                        className="dynamic-delete-button"
                                        onClick={() => {
                                            remove(field.name)
                                        }}
                                    />
                                }
                            </Form.Item>
                        ))}
                        <Form.Item>
                            <Button
                                type="dashed"
                                onClick={() => add()}
                                icon={<PlusOutlined />}
                            >
                                Add field
                            </Button>
                            <Form.ErrorList errors={errors} />
                        </Form.Item>
                    </>
                )}
            </Form.List>

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

效果如下:

参数介绍:

name="names"  前面nameForm.Item那么功能一致

fields数组对象

field对象,其中包含name,key等数据,具体如下:

add remove } 为解构出来的函数方法

{ errors } 为解构出来的错误列表,仅限配合 Form.List 的 rules 一同使用

问题及解决:
问题1:

需要一个初始的输入框,以及右侧的图标

Form.List name="names"中的names修改为所使用的数据源(渲染数组),即:

<Form.List name="names">    // 修改前

<Form.List name="DataArr">   // 修改后

输入框右侧的图标添加

在第一层的Form.Item里面进行添加,若是数据回显出现问题,请检查嵌套结构及name属性

tips: 多结构的添加需要以Form.Item来进行嵌套 

{(fields, { add, remove }, { errors }) => (
                            <>
                                {fields.map((field, index) => (
                                    <Form.Item
                                        label='配置项'
                                        required={false}
                                        key={field.key}
                                        help={
                                            index === fields.length - 1
                                                ? LastHelp
                                                : NTPHelp
                                        }
                                    >
                                        <Form.Item
                                            name={field.name}
                                            key={field.key}
                                        >
                                           <Input />
// 此处需要给Input框进行数据回显 由于Form.Item中name属性的限制,图标没有放置一起
                                        </Form.Item>
                                        {
                                            <div>
                                                {index !==
                                                    fields.length - 1 && (
                                                    <CloseCircleOutlined
                                                        onClick={() => {
                                                            remove(field.name)
                                                        }}
                                                    />
                                                )}
                                                {index ===
                                                    fields.length - 1 && (
                                                    <PlusCircleOutlined
                                                        onClick={() => {
                                                            add()
                                                        }}
                                                    />
                                                )}
                                            </div>
                                        }
                                    </Form.Item>
                                ))}
                            </>
                        )}
问题2

只在最后行设置help

help={
      index === fields.length - 1
            ? LastHelp
            : ' '
     }
label={
      index === 0 ? 'label' : ' ' // 有个空格
      }
问题3

每个输入框均有输入校验

Form.Item里设置rules,即

rules={[
     {
        required: true,
     },
     {
        pattern: /^[a-zA-Z0-9]{4,32}$/,
     },
]}

若是要设置动态help信息,则需使用下面这种校验,原理:利用useState的特性来设置help信息

rules={[
       () => ({
            validator(_, value) {
                 if (!reg.test(value)) { 
                      setHelp('定制的help信息')
                      return Promise.reject(new Error())
            }
                      setHelp('初始help信息')  //此处为重置Help, 可为空
                      return Promise.resolve()
            },
            }),
       ]}

// tips: 参数解释
// reg为你的正则
// setHelp为useState

相关代码为
const [Help, setHelp] = useState()

help={Help ||'初始help信息'}

效果如下:

初始状态

校验错误状态1

校验错误状态2

### 回答1: 在ant Design中,我们可以使用Form组件和Form.Item组件来创建表单动态增减表单可以通过state来控制表单的数量,然后根据state中的值来渲染对应数量的表单。 首先,我们需要设置一个state来保存表单的数量,可以使用数组来保存每个表单的值,例如: ```javascript state = { formItems: [{ id: 1, value: '' }] }; ``` 然后,我们可以通过map函数来遍历表单的数组,动态生成对应数量的表单: ```javascript const { formItems } = this.state; {formItems.map(item => ( <Form.Item key={item.id}> {getFieldDecorator(`item-${item.id}`, { initialValue: item.value })(<Input />)} </Form.Item> ))} ``` 当需要增加或减少表单的数量时,我们可以通过点击按钮来触发对应的函数,例如增加表单的函数可以这样实现: ```javascript addFormItem = () => { const { formItems } = this.state; const newFormItem = { id: formItems.length + 1, value: '' }; this.setState({ formItems: [...formItems, newFormItem] }); } ``` 删除表单的函数可以这样实现: ```javascript removeFormItem = (id) => { const { formItems } = this.state; const newFormItems = formItems.filter(item => item.id !== id); this.setState({ formItems: newFormItems }); } ``` 在表单提交时,我们可以通过getFieldsValue函数获取到表单的值并进行提交操作: ```javascript handleSubmit = (e) => { e.preventDefault(); const { form, formItems } = this.props; form.validateFields((err, values) => { if (!err) { const formValues = Object.keys(values).reduce((result, key) => { const id = parseInt(key.split('-')[1]); const value = values[key]; const formItem = formItems.find(item => item.id === id); result.push({ id, value }); return result; }, []); console.log(formValues); // 进行提交操作 } }); } ``` 以上就是使用antd实现动态增减表单并设置表单回显的方法,通过动态管理state中的表单数组来动态渲染、增减表单,通过getFieldsValue函数获取表单的值并进行提交操作。 ### 回答2: Antd 是一款基于 React 的 UI 组件库,它提供了一系列易于使用和美观的表单组件。在使用 Antd 动态增减表单时,我们可以很容易地实现表单的设置和回显。 首先,我们可以使用 Antd 的 Form 组件来创建表单。在表单的设置方面,我们可以通过调用 Form 的 getFieldDecorator 方法来设置表单的初始值、校验规则和事件处理函数等。 接着,当需要动态增减表单时,我们可以利用 Antd 的 Button 组件来触发增减操作。通过在点击事件中操作表单数据(如数组的 push、splice 等方法),我们可以动态添加删除表单。 对于表单的回显,我们可以在表单初始化时将表单值设置为从后端获取的数据。这样,当我们动态增减表单后,原有的表单会自动填充之前的值。这个过程可以通过在 Form 组件的 initialValue 属性中设置从后端获取的数据来实现。 当用户提交表单时,我们可以通过调用 Antd 提供的 Form 的方法(如 validateFieldsAndScroll)来验证并获取表单数据。然后,我们可以将表单数据提交到后端进行处理。 总结起来,通过使用 Antd 提供的 Form 组件结合动态增减表单的操作,我们可以很方便地设置和回显表单。同时,借助 Antd 的其他组件和方法,我们还能够实现表单的校验、事件处理和提交等功能。Antd 提供了一整套完善的表单解决方案,可供我们在各种场景中灵活使用。 ### 回答3: antd是一个非常流行的React UI组件库,提供了丰富的表单组件和功能。实现动态增减表单并设置表单回显有以下几个步骤: 1. 设置表单初始值:在使用antd表单组件时,可以通过`initialValues`属性设置表单的初始值。假设有一个列数据`list`,每个元素包含字段`name`和`value`,可以将其转化为初始值对象`initialValues`,其中每个字段的值对应表单的初始值。 2. 动态增减表单:通过antd提供的`Form.List`组件,可以实现多个表单动态增减。在表单中需要编辑和显示列数据时,可以使用`map()`方法循环渲染表单,并使用`remove()`方法删除不需要的表单。 3. 表单的读写绑定:在使用`Form.List`组件循环渲染表单时,可以使用`name`属性将每个表单与列数据的对应字段关联起来,实现读写绑定。这样,当表单的值发生变化时,列数据的对应字段值也会随之更新。 4. 表单回显:在设置表单初始值的基础上,antd表单组件会自动将初始值回显到表单中,用户可以看到之前已经填写的内容。当删除添加表单时,表单组件会自动处理表单的重新渲染和回显。 总结:通过设置表单初始值、使用`Form.List`组件实现动态增减表单表单的读写绑定以及antd的自动回显功能,可以实现antd动态增减表单并设置表单回显的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值