3步搞定企业级表单校验:antd-admin自定义规则与异步验证实战

3步搞定企业级表单校验:antd-admin自定义规则与异步验证实战

【免费下载链接】antd-admin An excellent front-end solution for enterprise applications built upon Ant Design and UmiJS 【免费下载链接】antd-admin 项目地址: https://gitcode.com/gh_mirrors/an/antd-admin

在企业级应用开发中,表单校验是保障数据准确性的关键环节。你是否还在为复杂的表单验证逻辑头疼?是否遇到过自定义校验规则难以实现的情况?本文将基于antd-admin项目,通过实际案例带你掌握表单校验的完整实现方案,包括基础验证、自定义规则和异步校验,让你轻松应对各种复杂场景。

表单校验基础:从内置规则到表单配置

antd-admin作为基于Ant Design和UmiJS的企业级前端解决方案,提供了完善的表单校验机制。在开始自定义校验之前,我们先了解项目中基础表单的配置方式。

基础表单结构

在antd-admin中,表单通常使用Ant Design的Form组件构建。以下是用户管理模块中的表单实现示例,位于src/pages/user/components/Modal.js

<Form ref={this.formRef} name="control-ref" initialValues={{ ...item, address: item.address && item.address.split(' ') }} layout="horizontal">
  <FormItem name='name' rules={[{ required: true }]} label={t`Name`} hasFeedback {...formItemLayout}>
    <Input />
  </FormItem>
  <FormItem name='phone' rules={[{ required: true, pattern: /^1[34578]\d{9}$/, message: t`The input is not valid phone!` }]} label={t`Phone`} hasFeedback {...formItemLayout}>
    <Input />
  </FormItem>
</Form>

常用内置校验规则

antd-admin中常用的内置校验规则包括:

规则描述示例
required是否必填{ required: true, message: '请输入姓名' }
pattern正则表达式验证{ pattern: /^1[34578]\d{9}$/, message: '手机号格式不正确' }
min/max最小值/最大值{ min: 18, max: 100, message: '年龄必须在18-100之间' }
len固定长度{ len: 11, message: '手机号必须为11位' }
type数据类型{ type: 'email', message: '邮箱格式不正确' }

触发校验的方式

在antd-admin中,通常通过调用validateFields方法触发表单校验,如src/pages/user/components/Modal.js中的实现:

handleOk = () => {
  this.formRef.current.validateFields()
    .then(values => {
      // 校验成功,处理表单数据
      const data = { ...values, key: item.key }
      data.address = data.address.join(' ')
      onOk(data)
    })
    .catch(errorInfo => {
      // 校验失败,处理错误信息
      console.log(errorInfo)
    })
}

自定义校验规则:满足复杂业务需求

当内置规则无法满足业务需求时,antd-admin支持通过validator函数实现自定义校验逻辑。以下是几种常见的自定义校验场景。

自定义函数实现复杂验证

假设我们需要验证密码强度,要求包含字母和数字且长度不小于8位,可以在表单规则中添加validator函数:

<FormItem 
  name="password" 
  label="密码"
  rules={[
    { required: true, message: '请输入密码' },
    { 
      validator: (rule, value, callback) => {
        if (!value.match(/^(?=.*[A-Za-z])(?=.*\d).{8,}$/)) {
          callback('密码必须包含字母和数字,且长度不小于8位')
        } else {
          callback()
        }
      }
    }
  ]}
>
  <Input.Password />
</FormItem>

跨字段依赖校验

在某些场景下,需要比较两个字段的值,如"密码"和"确认密码"。这时可以通过getFieldValue方法获取其他字段的值进行校验:

<FormItem 
  name="confirmPassword" 
  label="确认密码"
  rules={[
    { required: true, message: '请确认密码' },
    { 
      validator: (rule, value, callback) => {
        const password = form.getFieldValue('password')
        if (value !== password) {
          callback('两次输入的密码不一致')
        } else {
          callback()
        }
      }
    }
  ]}
>
  <Input.Password />
</FormItem>

动态调整校验规则

根据表单中其他字段的值,动态调整当前字段的校验规则。例如,当选择"其他"选项时,需要验证自定义输入的值:

<FormItem 
  name="otherReason" 
  label="其他原因"
  rules={[
    { 
      required: form.getFieldValue('reason') === 'other', 
      message: '请输入其他原因' 
    }
  ]}
>
  <Input placeholder="请输入其他原因" />
</FormItem>

异步校验:服务端验证的实现

在实际开发中,经常需要与后端交互进行校验,如验证用户名是否已存在。antd-admin支持通过返回Promise实现异步校验。

异步校验的基本实现

以下是一个验证用户名唯一性的异步校验示例:

<FormItem 
  name="username" 
  label="用户名"
  rules={[
    { required: true, message: '请输入用户名' },
    { 
      validator: async (rule, value) => {
        if (!value) return;
        const response = await api.checkUsernameExist(value);
        if (response.data.exist) {
          throw new Error('用户名已存在');
        }
      }
    }
  ]}
>
  <Input />
</FormItem>

优化异步校验体验

为提升用户体验,异步校验可以添加防抖处理,避免频繁请求后端接口:

import { debounce } from 'lodash';

// 防抖处理,300ms后执行
const checkUsername = debounce(async (value) => {
  const response = await api.checkUsernameExist(value);
  return response.data.exist;
}, 300);

// 在validator中使用
{
  validator: async (rule, value) => {
    if (!value) return;
    const exist = await checkUsername(value);
    if (exist) {
      throw new Error('用户名已存在');
    }
  }
}

结合Umi Request的异步校验

在antd-admin中,可以结合项目的请求工具实现异步校验。项目的请求工具位于src/services/api.js,以下是集成示例:

import { request } from 'umi';

// 异步校验函数
const validateUsername = async (rule, value) => {
  if (!value) return;
  const res = await request('/api/check-username', {
    method: 'POST',
    data: { username: value }
  });
  if (res.code !== 0) {
    throw new Error(res.message || '用户名验证失败');
  }
};

// 表单规则配置
<FormItem 
  name="username" 
  rules={[
    { required: true, message: '请输入用户名' },
    { validator: validateUsername }
  ]}
>
  <Input />
</FormItem>

校验状态与用户体验优化

良好的表单校验不仅要保证数据准确性,还要提供清晰的反馈,提升用户体验。antd-admin提供了多种方式优化校验体验。

校验状态反馈

通过hasFeedback属性可以为表单字段添加校验状态图标,增强视觉反馈:

<FormItem 
  name="email" 
  rules={[{ type: 'email', message: '请输入有效的邮箱地址' }]}
  label="邮箱"
  hasFeedback  // 显示校验状态图标
>
  <Input />
</FormItem>

实时校验与失焦校验

通过配置validateTrigger可以控制校验触发时机,平衡用户体验和性能:

// 实时校验(输入时触发)
<FormItem 
  name="username"
  rules={[{ required: true, message: '请输入用户名' }]}
  validateTrigger="onChange"  // 输入变化时触发校验
>
  <Input />
</FormItem>

// 失焦校验(输入框失去焦点时触发)
<FormItem 
  name="email"
  rules={[{ type: 'email', message: '请输入有效的邮箱地址' }]}
  validateTrigger="onBlur"  // 失焦时触发校验
>
  <Input />
</FormItem>

表单校验的完整流程

下图展示了antd-admin中表单校验的完整流程,包括规则定义、触发校验、验证处理和结果反馈:

mermaid

总结与最佳实践

通过本文的介绍,我们了解了antd-admin中表单校验的完整实现方案。以下是一些最佳实践建议:

  1. 优先使用内置规则:内置规则性能更好,覆盖了大部分常见场景
  2. 合理组织自定义规则:复杂的自定义规则建议提取为单独函数,提高复用性
  3. 异步校验添加加载状态:通过loading状态提示用户正在进行验证
  4. 控制校验触发时机:根据字段重要性和验证成本选择合适的触发时机
  5. 错误提示友好明确:错误信息应具体、易懂,指导用户如何修正

更多表单校验的高级用法,可以参考Ant Design官方文档和antd-admin项目的示例代码,如:

掌握这些表单校验技巧,将帮助你构建更健壮、用户体验更好的企业级应用。现在就动手实践,优化你的表单验证逻辑吧!

【免费下载链接】antd-admin An excellent front-end solution for enterprise applications built upon Ant Design and UmiJS 【免费下载链接】antd-admin 项目地址: https://gitcode.com/gh_mirrors/an/antd-admin

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值