Formily表单验证:3分钟搞定复杂表单验证的完整指南
【免费下载链接】formily📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3项目地址: https://gitcode.com/gh_mirrors/fo/formily
你是否还在为表单验证的复杂规则和错误处理而头疼?Formily作为跨设备、高性能的表单解决方案,提供了强大而灵活的验证系统,让你轻松应对各种表单场景。本文将带你快速掌握Formily表单验证的核心技巧,从基础规则到高级自定义验证,让你3分钟内搞定复杂表单验证。
📋 文章核心要点
- 核心关键词:Formily表单验证、表单验证规则
- 长尾关键词:Formily自定义验证规则、Formily异步验证、Formily错误处理、Formily联动验证、Formily验证最佳实践
🎯 痛点分析:为什么表单验证如此复杂?
在开发中大型应用时,表单验证常常成为开发者的噩梦。传统的表单验证方案通常面临以下问题:
- 规则分散:验证逻辑分散在各个组件中,难以维护
- 异步验证复杂:需要手动处理异步请求和状态管理
- 错误信息展示混乱:不同组件的错误展示方式不统一
- 联动验证困难:字段间的依赖验证实现复杂
- 性能问题:频繁的验证操作影响用户体验
Formily通过统一的验证引擎解决了这些问题,提供了完整的验证解决方案。
🏗️ Formily验证系统架构
Formily的验证系统基于@formily/validator验证引擎,支持多种验证场景:
三种验证模式对比
| 验证模式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| JSON Schema验证 | 配置化表单、动态表单 | 声明式配置、易于维护 | 学习曲线较陡 |
| 纯JSX验证 | 简单表单、快速原型 | 直观易懂、开发快速 | 代码量较大 |
| 混合模式 | 复杂业务场景 | 灵活组合、发挥各自优势 | 需要合理规划 |
Formily验证核心组件
Formily的验证系统包含以下核心组件:
- 验证引擎(@formily/validator) - 提供基础验证能力
- 表单模型(@formily/core) - 管理表单状态和验证逻辑
- UI组件(@formily/react/@formily/vue) - 提供验证状态展示
🚀 快速上手:5分钟搭建验证表单
步骤1:安装Formily
# React版本 npm install @formily/core @formily/react @formily/validator # Vue版本 npm install @formily/core @formily/vue @formily/validator步骤2:基础必填验证
Formily提供了最简单的必填验证方式:
// 使用JSON Schema方式 <SchemaField.String name="username" title="用户名" required // 只需一个属性 x-component="Input" x-decorator="FormItem" /> // 使用JSX方式 <Field name="username" title="用户名" required component={[Input]} decorator={[FormItem]} />步骤3:常用验证规则
Formily内置了丰富的验证规则:
// 长度限制 <SchemaField.String name="password" title="密码" minLength={6} maxLength={20} x-component="Input.Password" x-decorator="FormItem" /> // 数值范围 <SchemaField.Number name="age" title="年龄" minimum={18} maximum={60} x-component="NumberPicker" x-decorator="FormItem" /> // 枚举值 <SchemaField.String name="gender" title="性别" enum={['male', 'female']} x-component="Select" x-decorator="FormItem" />🔧 内置格式验证:告别复杂正则表达式
Formily提供了多种内置格式验证,让你无需编写复杂的正则表达式:
常用格式验证类型
| 格式类型 | 描述 | 使用示例 |
|---|---|---|
| 邮箱格式验证 | format="email" | |
| url | URL地址验证 | format="url" |
| phone | 电话号码验证 | x-validator="phone" |
| idcard | 身份证验证 | x-validator="idcard" |
| date | 日期格式验证 | format="date" |
格式验证示例
<SchemaField.String name="email" title="邮箱" required format="email" // 直接使用内置格式 x-component="Input" x-decorator="FormItem" /> <SchemaField.String name="website" title="个人网站" format="url" x-component="Input" x-decorator="FormItem" />⚡ 自定义验证规则:满足业务特殊需求
当内置规则无法满足需求时,Formily允许你注册自定义验证规则。
全局规则注册
import { registerValidateRules } from '@formily/core' // 注册自定义验证规则 registerValidateRules({ // 简单验证规则 customRule(value) { if (!value) return '' return value !== '123' ? '值必须为123' : '' }, // 带参数的验证规则 rangeCheck(value, rule) { if (!value) return '' const { min, max } = rule if (value < min) return `值不能小于${min}` if (value > max) return `值不能大于${max}` return '' } })使用自定义规则
<SchemaField.String name="custom_field" title="自定义验证" required x-validator={{ customRule: true, rangeCheck: { min: 10, max: 100 } }} x-component="Input" x-decorator="FormItem" />🔄 异步验证:与后端API无缝集成
在实际业务中,经常需要验证用户名是否已存在、邮箱是否已注册等场景,Formily的异步验证让这一切变得简单。
异步验证示例
<SchemaField.String name="username" title="用户名" required x-validator={async (value) => { if (!value || value.length < 3) { return '用户名至少3个字符' } try { // 调用后端API检查用户名 const exists = await api.checkUsername(value) return exists ? '用户名已存在' : '' } catch (error) { return '验证服务暂时不可用' } }} x-component="Input" x-decorator="FormItem" />异步验证优化技巧
✅防抖处理:避免频繁请求 ✅缓存结果:相同输入不重复验证
✅超时处理:设置合理的超时时间 ✅错误降级:网络异常时的友好提示
🔗 联动验证:智能字段依赖验证
复杂表单中,字段间常常存在依赖关系。Formily通过effects或reactions实现智能联动验证。
密码确认验证
<SchemaField> <SchemaField.String name="password" title="密码" required x-component="Input.Password" x-decorator="FormItem" /> <SchemaField.String name="confirm_password" title="确认密码" required x-validator={(value, rule, ctx) => { // 获取密码字段的值 const password = ctx.form.values.password return value === password ? '' : '两次密码不一致' }} x-component="Input.Password" x-decorator="FormItem" /> </SchemaField>条件验证示例
<SchemaField.String name="phone" title="手机号" required x-validator={{ phone: true, // 根据其他字段值动态调整验证规则 validator: (value, rule, ctx) => { const country = ctx.form.values.country if (country === 'china' && !/^1[3-9]\d{9}$/.test(value)) { return '请输入有效的中国手机号' } return '' } }} x-component="Input" x-decorator="FormItem" />🎨 错误处理与展示:提升用户体验
错误信息自定义
<SchemaField.String name="required_field" title="必填项" required x-validator={{ required: { message: '这个字段非常重要,请务必填写!' } }} x-component="Input" x-decorator="FormItem" />多状态验证反馈
Formily支持多种验证状态,让用户获得更清晰的反馈:
<SchemaField.Number name="score" title="评分" x-validator={(value) => { if (value < 60) { return { type: 'error', message: '不及格,需要努力!' } } else if (value < 80) { return { type: 'warning', message: '合格,还有提升空间' } } else if (value < 100) { return { type: 'success', message: '优秀,继续保持!' } } return '' }} x-component="NumberPicker" x-decorator="FormItem" />📊 验证状态管理API
Formily提供了丰富的API来管理验证状态:
| API | 描述 | 使用场景 |
|---|---|---|
form.validate() | 手动触发表单验证 | 提交前验证 |
form.invalid | 表单是否有错误 | 禁用提交按钮 |
form.errors | 获取所有错误信息 | 错误汇总展示 |
field.validate() | 验证单个字段 | 实时验证 |
field.invalid | 字段是否有错误 | 错误状态样式 |
field.errors | 获取字段错误 | 错误信息展示 |
表单提交示例
const handleSubmit = async () => { // 验证整个表单 const valid = await form.validate() if (valid) { // 验证通过,提交数据 await submitData(form.values) } else { // 验证失败,处理错误 console.log('表单错误:', form.errors) // 可以跳转到第一个错误字段 const firstErrorField = Object.keys(form.errors)[0] // 滚动到错误字段 } }🚫 避坑指南:常见问题与解决方案
问题1:验证不触发
原因:未正确设置验证规则或字段配置错误解决方案:
- 检查是否设置了
required或x-validator属性 - 确保字段名称正确
- 验证表单装饰器是否正确包裹
问题2:异步验证卡顿
原因:频繁触发异步验证请求解决方案:
- 使用防抖(debounce)延迟验证
- 合理设置验证触发时机
- 缓存验证结果
问题3:错误信息不显示
原因:UI组件未正确响应验证状态解决方案:
- 检查是否使用了Formily提供的装饰器
- 确认错误信息的传递路径
- 验证样式是否正确应用
问题4:联动验证复杂
原因:字段间依赖关系复杂解决方案:
- 使用effects统一管理验证逻辑
- 合理拆分验证规则
- 使用x-reactions实现简单联动
🏆 最佳实践:提升表单验证体验
1. 分层验证策略
将验证分为三个层次:
- 基础验证:必填、格式等基础规则
- 业务验证:业务逻辑相关的验证
- 服务端验证:需要调用API的验证
2. 性能优化技巧
- 延迟验证:用户输入完成后才触发验证
- 批量验证:多个字段同时验证时合并请求
- 缓存策略:相同输入值不重复验证
3. 用户体验优化
- 即时反馈:输入时实时验证
- 清晰提示:错误信息明确易懂
- 渐进式验证:复杂表单分步骤验证
4. 代码组织建议
// 将验证规则统一管理 export const validationRules = { username: { required: true, minLength: 3, maxLength: 20, pattern: /^[a-zA-Z0-9_]+$/, message: '用户名格式不正确' }, email: { required: true, format: 'email' }, // ... 更多规则 } // 在组件中使用 <SchemaField.String name="username" title="用户名" x-validator={validationRules.username} x-component="Input" x-decorator="FormItem" />📈 进阶技巧:高级验证场景
动态验证规则
根据业务状态动态调整验证规则:
const [userType, setUserType] = useState('personal') // 动态验证规则 const getValidationRules = (type) => { const baseRules = { required: true } if (type === 'enterprise') { return { ...baseRules, pattern: /^[A-Za-z0-9\s]+$/, message: '企业名称只能包含字母、数字和空格' } } return baseRules } // 在组件中使用 <SchemaField.String name="name" title={userType === 'enterprise' ? '企业名称' : '姓名'} x-validator={getValidationRules(userType)} x-component="Input" x-decorator="FormItem" />跨字段验证
实现复杂的跨字段验证逻辑:
// 使用effects实现复杂验证 const form = createForm({ effects() { onFieldValueChange('startDate', (field) => { const endDateField = field.query('endDate') if (endDateField.value && field.value > endDateField.value) { field.setSelfErrors(['开始日期不能晚于结束日期']) } }) onFieldValueChange('endDate', (field) => { const startDateField = field.query('startDate') if (startDateField.value && field.value < startDateField.value) { field.setSelfErrors(['结束日期不能早于开始日期']) } }) } })验证规则组合
组合多个验证规则,实现复杂的验证逻辑:
<SchemaField.String name="password" title="密码" x-validator={[ { required: true, message: '密码不能为空' }, { minLength: 8, message: '密码至少8位' }, { pattern: /[A-Z]/, message: '必须包含大写字母' }, { pattern: /[a-z]/, message: '必须包含小写字母' }, { pattern: /[0-9]/, message: '必须包含数字' }, { pattern: /[^A-Za-z0-9]/, message: '必须包含特殊字符' } ]} x-component="Input.Password" x-decorator="FormItem" />🔮 总结与展望
Formily的表单验证系统提供了从简单到复杂的完整解决方案。通过本文的介绍,你已经掌握了:
✅基础验证规则:必填、长度、范围等基础验证 ✅内置格式验证:邮箱、电话、URL等常见格式验证
✅自定义验证规则:满足特殊业务需求的验证逻辑 ✅异步验证:与后端API集成的验证方式 ✅联动验证:字段间依赖关系的智能验证 ✅错误处理:友好的错误提示和状态管理
未来发展方向
Formily验证系统仍在不断进化,未来可能会加入:
- AI智能验证:基于机器学习的智能验证规则
- 可视化验证配置:拖拽式验证规则配置界面
- 性能监控:验证性能分析和优化建议
- 国际化支持:多语言错误信息自动适配
学习资源推荐
- 官方文档:docs/guide/advanced/validate.md
- 源码学习:packages/validator/src/validator.ts
- 实践案例:docs/guide/scenes/login-register.md
- 进阶指南:docs/guide/advanced/linkages.md
Formily的验证系统既强大又灵活,能够满足从简单到复杂的各种验证需求。通过合理使用各种验证功能,你可以大大提升开发效率和用户体验。
记住,好的表单验证不仅仅是技术实现,更是用户体验的重要组成部分。合理设计验证逻辑,提供清晰的反馈,让你的表单更加友好和高效!
【免费下载链接】formily📱🚀 🧩 Cross Device & High Performance Normal Form/Dynamic(JSON Schema) Form/Form Builder -- Support React/React Native/Vue 2/Vue 3项目地址: https://gitcode.com/gh_mirrors/fo/formily
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考