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 逻辑正确处理空值场景。

相关推荐
界面开发小八哥3 小时前
界面控件DevExpress Blazor v26.1新版亮点 - Navigation(导航)
javascript·.net·界面控件·blazor·devexpress·ui开发
SendTomo4 小时前
send.wang(私传网)基于网页P2P直连传输大文件的优势
javascript·网络·webrtc·html5·p2p
学习星球5 小时前
Astro 全栈实战:拆解 RealWorld 项目
前端·javascript·架构·系统架构·前端框架·c5全栈
张元清6 小时前
React useTimeout Hook:声明式 setTimeout 与自动清理 (2026)
javascript·react.js
禁止摆烂_才浅6 小时前
JavaScript 类型判断:instanceof 与 constructor 原理深度解析
前端·javascript·面试
Asize7 小时前
HTTP 明明无状态,登录态怎么就保住了——React + Zustand + JWT 鉴权全流程拆解
前端·javascript
嘟嘟07177 小时前
JWT 登录认证完整流程(React + Vite 实战复习)
react.js·vite
张人玉7 小时前
基于 Vue 3 + ECharts + Three.js + Express + SQLite——智慧城市数字孪生可视化平台
javascript·vue.js·信息可视化·sqlite·echarts
meilindehuzi_a8 小时前
React JWT 登录鉴权实战:从无状态 HTTP 到路由守卫、Zustand 与 Axios 拦截器
前端·react.js·http
爱酱丶8 小时前
VS Code 快速生成Vue3 + TypeScript + Setup 基础空模板
前端·javascript·typescript