antd Form.List内字段的关联校验

引言
近期碰到一个需求,需要一个列表式的表单提交,列表内每一项之间都存在关联校验
实现

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

interface IProps {
    initValues: ObjectAny[];
}
 
const FormListTest = () => {
  const [form] = Form.useForm()
 
  const onFinish = (values: ObjectAny) => {
    console.log(values)
  }

  return (
    <>
      <Form className='edit-form' form={form} onFinish={onFinish} initialValues={{
        myPhones: [{}]
      }} >
        <Form.List name='myPhones'>
          { (fields, { add, remove }) => {
            const list =  fields.map((field: ObjectAny, index: number) => (
              <>
                <Button onClick={() => remove(field.name)}>删除联系方式</Button>
                <Form.Item
                  rules={[
                    {pattern: /^\d{5}$/, message: '请输入5位数字'},

                  ]}
                  name={ [field.name, 'phoneNumber'] }
                  fieldKey={ [field.fieldKey, 'phoneNumber'] }
                >
                  <Input placeholder='请输入直线或短号' />
                </Form.Item>
                <Form.Item
                  rules={[
                    {
                      validator(_, value: string, callback) {
                          if (value.match(/^\d{5}$/)) {
                              callback();
                          } else {
                              callback('请输入5位数字');
                          }
                      }
                    },
                    ({ getFieldValue }) => ({
                      validator(_, value) {
                        // 注意,获取依赖项前一定要先判断myPhones[field.name]是否为undefined(在这里踩过坑)
                        const phoneNumber = getFieldValue('myPhones')[field.name]?.phoneNumber;
                        if (value && (phoneNumber === '' || phoneNumber === undefined)) {
                          return Promise.reject(new Error("请输入直线或短号"));
                        }
                        return Promise.resolve();
                      },
                    }),
                  ]}
                  // 留意dependencies的写法:Form.List的名字 field.name 字段名
                  dependencies={[['myPhones', field.name, 'phoneNumber']]}
                  name={ [field.name, 'phoneNumberExtend'] }
                  fieldKey={ [field.fieldKey, 'phoneNumberExtend'] }
                >
                  <Input placeholder='分机号' />
                </Form.Item>
              </>
            ));
            list.push(<Button type='primary' onClick={() => add()}>添加座机</Button>);
            return list;
          }}
        </Form.List>
        
        <Form.Item
            name="mobile"
            label="手机"
            rules={[
                {
                    validator(_, value: string, callback) {
                        if (value.match(/^(1[3-9])\d{9}$/)) {
                            callback();
                        } else {
                            callback('手机号格式有误');
                        }
                    }
                }
            ]}
        >
            <Input />
        </Form.Item>
        <Form.Item>
          <Button htmlType='submit' type='primary'>
            Submit
          </Button>
        </Form.Item>
      </Form>
    </>
  )
}
 
export default FormListTest;

结果示例
在这里插入图片描述
删除依赖项之后的验证提示:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值