arco design form表单自定义校验空值时注意事项

Arco Design 的 Form 组件支持通过 rules 配置校验规则,默认情况下可以通过 required: true 设置字段必填。如果使用了自定义 validator,但希望字段为空时跳过校验(即不触发空值错误),需要手动在 validator 中处理空值逻辑。

实现方法

rules 中配置 validator 函数,并在函数中检查值是否为空。如果值为空,直接返回校验通过;如果值非空,则执行自定义校验逻辑。

示例代码

jsx 复制代码
import React from 'react';
import { Form, Input, Button } from '@arco-design/web-react';

const App = () => {
  const [form] = Form.useForm();

  // 自定义校验规则
  const customValidator = (value, callback) => {
    // 如果值为空,直接通过校验(跳过空值校验)
    if (!value) {
      callback(); // 空值时校验通过
      return;
    }

    // 非空值时执行自定义校验逻辑
    // 例如:校验值是否为特定格式(如数字)
    const isValid = /^\d+$/.test(value);
    if (isValid) {
      callback(); // 校验通过
    } else {
      callback('请输入纯数字'); // 校验失败,返回错误信息
    }
  };

  return (
    <Form
      form={form}
      layout="vertical"
      onSubmit={(values) => {
        console.log('提交数据:', values);
      }}
    >
      <Form.Item
        label="数字输入"
        field="number"
        rules={[
          {
            validator: customValidator, // 使用自定义校验
          },
        ]}
      >
        <Input placeholder="请输入数字(可选)" />
      </Form.Item>
      <Form.Item>
        <Button type="primary" htmlType="submit">
          提交
        </Button>
      </Form.Item>
    </Form>
  );
};

export default App;

代码说明

  1. 自定义校验函数 (customValidator)

    • 参数 value:当前字段的值。
    • 参数 callback:校验完成后的回调函数,用于返回校验结果。
      • 调用 callback() 表示校验通过。
      • 调用 callback('错误信息') 表示校验失败并返回错误信息。
    • 在函数中,首先检查 value 是否为空(!value),如果是空值,直接调用 callback() 跳过校验。
    • 如果值非空,则执行自定义校验逻辑(例如检查是否为纯数字)。
  2. 禁止空值校验

    • 通过在 validator 中显式检查空值并返回 callback(),避免了空值触发错误。
    • 没有设置 required: true,因此字段默认是非必填的。
  3. 规则配置

    • Form.Itemrules 中只配置了 validator,没有其他校验规则(如 required),确保空值不会触发默认的必填校验。

注意事项

  • 避免 required: true :如果在 rules 中设置了 { required: true },Arco Design 会强制要求字段非空,这会覆盖自定义 validator 的空值逻辑。因此,如果希望字段可选,不要 设置 required: true

  • 多规则组合 :如果你需要在 rules 中组合多个校验规则,确保其他规则(如 minLengthmaxLength)不会与空值校验冲突。例如:

    javascript 复制代码
    rules={[
      { minLength: 3, message: '至少输入3个字符' }, // 仅在非空时生效
      { validator: customValidator },
    ]}

    Arco Design 的校验规则会按顺序执行,空值会在 validator 中被处理。

  • 异步校验 :如果你的校验逻辑需要异步操作(例如调用后端接口),可以让 validator 返回一个 Promise:

    javascript 复制代码
    const asyncValidator = async (value, callback) => {
      if (!value) {
        callback(); // 空值通过
        return;
      }
      try {
        // 模拟异步校验
        const isValid = await mockApiCheck(value);
        if (isValid) {
          callback();
        } else {
          callback('校验失败');
        }
      } catch (error) {
        callback('校验出错');
      }
    };
  • 表单初始化值 :确保表单的初始值(通过 initialValuesdefaultValue 设置)不会干扰空值逻辑。如果初始值是 undefinednullvalidator 的空值检查应正确处理这些情况。

总结

通过在 validator 自定义校验函数中显式处理空值(if (!value) callback()),可以禁止 Arco Design Form 的空值校验,同时保留对非空值的自定义校验逻辑。关键点是避免使用 required: true 并确保 validator 逻辑正确处理空值场景。

相关推荐
寧笙(Lycode)1 小时前
React系列——HOC高阶组件的封装与使用
前端·react.js·前端框架
拖孩1 小时前
【Nova UI】十五、打造组件库之滚动条组件(上):滚动条组件的起步与进阶
前端·javascript·css·vue.js·ui组件库
苹果电脑的鑫鑫1 小时前
element中表格文字剧中可以使用的属性
javascript·vue.js·elementui
一丝晨光2 小时前
数值溢出保护?数值溢出应该是多少?Swift如何让整数计算溢出不抛出异常?类型最大值和最小值?
java·javascript·c++·rust·go·c·swift
Wannaer2 小时前
从 Vue3 回望 Vue2:响应式的内核革命
前端·javascript·vue.js
懒羊羊我小弟3 小时前
手写符合Promise/A+规范的Promise类
前端·javascript
赵大仁3 小时前
React vs Vue:点击外部事件处理的对比与实现
javascript·vue.js·react.js
肥肥呀呀呀4 小时前
在Flutter上如何实现按钮的拖拽效果
前端·javascript·flutter
Zero1017134 小时前
【React的useMemo钩子详解】
前端·react.js·前端框架
付朝鲜5 小时前
用自写的jQuery库+Ajax实现了省市联动
java·前端·javascript·ajax·jquery