Antd的Form表单设置validator自定义校验后,required必填校验就不生效?

30 篇文章 1 订阅
12 篇文章 4 订阅
背景描述:

做运营系统、后台系统、ToB项目时避免不了需要研发表单,要填写各种内容。
博主有一年左右没做后台了,重新拾起来。
操作:给Form.Item的属性rules,给rules里面指定了 { required: true }, 同时给了 validator
自定义校验方法。
问题描述:自定义校验后,required 必填不起效。

环境:

Ant Design版本:4.24.10, React版本: 17.0.2

代码:

❎ 错误代码:

<Form.Item
    name="id"
    label="ID"
    validateTrigger={['onBlur']}
    rules={[
        { required: true, message: '必填' },
        { pattern: /^.{0,15}$/, message: '不超过15个字母或数字' },
        {
            validator: (rule, value, callback) => {
                // 校验重复, xxxApi这里是某异步请求
                xxxApi({ id: value })
                    .then(res => {
                        return Promise.resolve();
                    })
                    .catch(e => {
                        return Promise.reject(e.message || '货品ID已存在');
                    });
            },
        },
    ]}
    // 正则中的.代表\n以外的任意字符
>
    <Input
        placeholder="请输入,不超过15个字母或数字"
        allowClear
    />
</Form.Item>

遇到这个问题,输入框打完字,鼠标离开,就是不出现“必填”的提示。

解决:

排查好一会儿,才发现validator 方法没写 return

✅ 正确代码:

 {
    validator: (rule, value, callback) => {
        // 校验重复, xxxApi这里是某异步请求
        return xxxApi({ id: value }) // 这里!!! 加 return
            .then(res => {
                return Promise.resolve();
            })
            .catch(e => {
                return Promise.reject(e.message || '货品ID已存在');
            });
    },
}

validator也可以这样写(不用箭头函数):

{
    validator(rule, value, callback){
         // ...
      },
}

还有一种原因,validator方法处理不好的话,会覆盖 require:true

代码如下:

<Form.Item
   label="ID"
     name="id"
     validateTrigger={['onBlur']}
     rules={[
         { required: true, message: '必填' },
         {
             validator: handleVerifyExit,
         },
     ]}
 >
     <Input placeholder="请输入" style={{ width: inputWidth }} allowClear />
 </Form.Item>
 
 // 校验函数可以抽出去
function handleVerifyExit(_: any, val: any) {
  // 注意这行 !!!是为了避免输入为空时去请求接口,有值才发校验请求
  if (!val) return ; 
  return verifyCrmInfo({
      type: form.getFieldValue('type'), // 另一个输入框的值
      id: val,
  }).then(
      res => {
          console.log('校验成功:', res);
      },
      res => {
          console.log('校验失败:', val, res);
          return Promise.reject(res.message);
      },
  );
}

注意这里的: if (!val) return ; 它会在输入为空时,将必填的校验覆盖。
理解一下,这里的逻辑是:输入项未填时,为false,那么return。这就代表了返回是空。因此不会提示必填。

✅正确代码:

 if (!value || value.trim() === '') {
    return Promise.reject('This field is required');
}

这样就解决了必填校验未生效的问题(实际还是需要逻辑严谨)

记录一下,方便回顾,亦分享经验,希望帮助到踩坑的小伙伴~

在使用 Ant Design Vue 的 `a-form` 表单时,自定义校验器可以使用 `validator` 属性来指定。默认情况下,校验器会对表单项进行非空判断。如果你想要自定义校验器但不想进行非空判断,可以在校验器函数中手动判断。 例如,你可以定义一个自定义校验器函数来检查输入值是否为正整数: ```javascript const validatePositiveInteger = (rule, value, callback) => { if (value && !/^[1-9]\d*$/.test(value)) { callback(new Error('请输入正整数')) } else { callback() } } ``` 在这个例子中,我们首先判断了输入值是否存在,如果存在,再使用正则表达式来判断输入值是否为正整数,如果不是,则调用 `callback` 函数并传递错误信息。如果输入值是正整数,则调用 `callback` 函数并传递一个空参数,表示校验通过。 然后,你可以在表单项中使用这个自定义校验器,并在 `rules` 属性中指定它: ```html <a-form-item label="正整数"> <a-input v-model:value="value" /> </a-form-item> ``` ```javascript { data() { return { value: '' } }, setup() { const { validatePositiveInteger } = yourValidateFunctions const rules = { value: [ { required: true, message: '请输入值' }, { validator: validatePositiveInteger, message: '请输入正整数' } ] } return { rules } } } ``` 在这个例子中,我们在 `rules` 属性中定义了一个校验规则,其中包括了一个非空校验规则和一个自定义校验规则。当表单项的值发生变化时,Ant Design Vue 会自动触发这些校验规则,然后根据校验结果来显示错误信息或者提交表单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清颖~

您的鼓励让我们一起进步,加油!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值