使用antd开发可动态增加项的表单

本文介绍如何使用 Ant Design 的 Form 组件实现用户输入异常情况通知方式及联系人信息的功能,包括表单验证、动态增删表单项及数据结构化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我不知道应该怎么描述这个功能才算清晰,看图吧
这里写图片描述
环境是在antd的Form组件内开发大概的功能如下:

  • 用户需要选择异常情况通知方式,并填写最少一个最多三个的联系人姓名和联系方式。

  • 期望用户点击加号,可以增加一条,最多三条。

  • 内容需校验,输入不能为空,联系方式需要根据用户勾选的通知方式校验输入内容,即用户勾选短信时,联系方式校验规则为手机号,勾选邮件时,校验方式为邮箱。

  • 输入部分的数据结构应为数组,数据展示时可以通过遍历数组方便数据展示。并且联系人称呼和联系方式存在对应关系。

一言不合上代码

组件部分


<FormItem
            {...formItemLayout}
            label="异常情况通知"
          >{getFieldDecorator('contactType', {
            initialValue: data.contactType,
            rules: [{
              required: true,
              message: '订单消息通知至少选择一个渠道!',
            }],
          })(
            <Radio.Group onChange={e => oncontactType(e)} disabled={!data.informWay}>
              <Radio value="0">短信</Radio>
              <Radio value="1">邮件</Radio>
            </Radio.Group>,
            )}
          </FormItem>
          <FormItem
            {...submitFormLayout}
          >
            <div className="informWay" >
              { data.informWay && data.informWay.map((element, index) => (
                <span key={index}>
                  <FormItem>
                    {getFieldDecorator(`man${index}`, {
                      initialValue: element.name,
                      rules: [{
                        required: true,
                        message: '请输入联系人称呼!',
                      }],
                    })(
                      <Input placeholder="请输入联系人称呼" />,
                      )}
                  </FormItem>
                  <FormItem>
                    {getFieldDecorator(`link${index}`, {
                      initialValue: element.link,
                      rules: [{
                        required: true,
                        message: '请输入联系方式!',
                      }, {
                        pattern: contactType === '0' ? /^0?(13[0-9]|15[012356789]|17[013678]|18[0-9]|14[57])[0-9]{8}$/ : /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/,
                        message: contactType === '0' ? '手机号码格式错误!' : '邮箱格式错误',
                      }],
                    })(
                      <Input placeholder="请输入联系方式" />,
                      )}
                  </FormItem>
                  {index < 2 && <Button shape="circle" size="small" icon="plus" type="primary" onClick={() => onLinkWay(index, 'add')} />}
                  {index > 0 && <Button shape="circle" size="small" icon="minus" type="default" onClick={() => onLinkWay(index, 'minus')} />}
                </span>
              ))}
            </div>
          </FormItem>

数据拼接部分

    validateFields((err, values) => {
      // 用新的对象承载提交的数据
      const abc = {
        ...values,
        informWay: [],
      };
      const arr = []; // 保存输入框内的值
      const arrD = []; // 保存key值
      const test = /^(link)|(man)\d$/;
      // 拿到异常通知相关输入的所有值
      if (!err) {
        // eslint-disable-next-line
        for (const key in abc) {
          if (test.test(key)) {
            arr.push(abc[key]);
            arrD.push(key);
          }
        }
        // 进行数据拼装
        const arr1 = arr.map((ele, i, a) => {
          if (i % 2 === 0) {
            const obj = {};
            obj.contactName = ele;
            obj.contactWay = a[i + 1];
            return obj;
          }
          return null;
        }).filter(ele => ele !== null);
        abc.informWay = arr1;
        arrD.forEach(ele => delete abc[ele]); // 删除多余键值对
        onSubmit(abc);
      }
    });

看一下最终的效果
这里写图片描述

最后贴一下组件的数据结构吧

informWay:[
{contactName:'',contactWay:''},
{contactName:'',contactWay:''},
]
<think>好的,我现在需要帮助用户解决关于AntDesign表单校验某一特定的实现方法或示例的问题。首先,我要回忆一下用户之前提到的引用内容,确保回答符合他们的需求。用户提供的引用[1]和[2]都是关于Ant Design表单自定义校验规则的例子。引用[1]展示了使用validator函数来验证复选框是否被选中,而引用[2]则演示了两种方法:一种是直接在rules中使用pattern正则表达式,另一种是通过validator函数进行更复杂的验证。用户现在想了解如何针对特定表单进行校验,可能需要具体的实现步骤和示例代码。首先,我应该分步骤说明不同的校验方法。Ant Design的表单校验主要依赖于Form.Item的rules属性,所以需要介绍如何在该属性中配置规则。常见的方法包括使用内置规则如required、pattern,以及自定义validator函数。用户可能需要知道这些方法的具体应用场景和写法。 接下来,我需要给出每种方法的示例代码。例如,内置规则的例子可能包括必填校验和正则表达式校验,而自定义校验函数则可以处理更复杂的逻辑,比如依赖其他字段的值或异步校验。要确保代码示例正确,并符合用户提供的引用中的结构,比如使用validator时返回Promise.resolve或reject。另外,用户可能对如何组合多种规则感兴趣,比如同时使用必填和正则校验。需要说明在rules数组中添加多个规则对象即可实现。同时,可能需要提醒用户关于自定义校验函数中的参数使用,如rule和value,以及如何处理错误消息。 还需要注意用户提到的中文回答要求,所以所有的解释和注释都要用中文。同时,确保LaTeX格式正确,但在当前问题中可能涉及较少数学公式,但如果有需要,比如正则表达式中的模式,可能需要用行内代码块而非LaTeX。最后,生成相关问题,帮助用户进一步探索。例如,如何动态校验、异步校验或联动校验,这些都是用户可能在后续开发中遇到的问题。总结一下,回答的结构应该是:先概述,然后分点讲解不同方法,每种方法附上示例代码,最后给出相关问题。确保引用正确的示例,并参考用户提供的代码结构,避免错误。</think>### Ant Design表单特定校验实现方法 Ant Design表单通过`Form.Item`的`rules`属性实现单校验,以下是三种常用方法: #### 一、内置规则校验 1. **必填校验** ```jsx <Form.Item name="username" rules={[{ required: true, message: '请输入用户名' }]} > <Input /> </Form.Item> ``` 2. **正则校验** 使用`pattern`匹配邮箱格式: ```jsx <Form.Item name="email" rules={[ { pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, message: '邮箱格式错误' } ]} > <Input /> </Form.Item> ``` #### 二、自定义校验函数 通过`validator`实现复杂逻辑,如密码强度验证: ```jsx <Form.Item name="password" rules={[ { validator: (rule, value) => { if (!/(?=.*[A-Z])(?=.*[0-9])/.test(value)) { return Promise.reject('需包含大写字母和数字'); } return Promise.resolve(); } } ]} > <Input.Password /> </Form.Item> ``` #### 三、混合规则校验 同时使用多规则: ```jsx <Form.Item name="phone" rules={[ { required: true, message: '手机号必填' }, { pattern: /^1[3-9]\d{9}$/, message: '非有效手机号' } ]} > <Input /> </Form.Item> ``` #### 四、跨字段校验 验证两次输入是否一致: ```jsx <Form.Item name="confirmPassword" dependencies={['password']} // 依赖password字段 rules={[ ({ getFieldValue }) => ({ validator(rule, value) { if (value !== getFieldValue('password')) { return Promise.reject('两次输入不一致'); } return Promise.resolve(); } }) ]} > <Input.Password /> </Form.Item> ``` [^1][^2]
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值