输入完成验证示例

对比三种验证模式:validateOnComplete (智能) vs validateOnChange (频繁) vs validateOnBlur (延迟)

智能检测输入完成,用户体验最佳

验证次数: 0
💡 输入3个字符后,停止500ms自动验证
💡 输入@和.后,停止600ms自动验证
💡 输入满11位后,停止200ms自动验证
✅ 优点:
  • 验证时机恰当,不打扰用户
  • 减少不必要的验证
  • 支持异步验证防抖
  • 自定义完成条件

⚡ validateOnChange

每次输入都验证,可能过于频繁

验证次数: 0
⚠️ 每次按键都验证,可能干扰用户
⚠️ 输入"t"就提示错误
⚠️ 输入"1"就提示格式错误
❌ 缺点:
  • 验证次数过多
  • 输入时就显示错误,体验差
  • 异步验证会频繁触发

👀 validateOnBlur

失去焦点时验证,反馈较慢

验证次数: 0
ℹ️ 点击其他地方才验证
ℹ️ 失去焦点才验证
ℹ️ Blur后才验证
⚠️ 缺点:
  • 反馈延迟,用户需等待
  • 可能填完整个表单才发现错误
  • 需要手动切换焦点

📖 实现代码

validateOnComplete 配置

const form = useFormState({
  fields: {
    username: {
      validator: Validators.compose(
        Validators.required(),
        Validators.minLength(3),
        usernameAvailableValidator // 异步验证
      ),
      validateOnComplete: true,
      // 自定义完成条件
      completeCondition: (value) => {
        return value.length >= 3;
      },
      // 防抖延迟(毫秒)
      debounceMs: 500
    },
    email: {
      validator: Validators.compose(
        Validators.required(),
        Validators.email()
      ),
      validateOnComplete: true,
      completeCondition: (value) => {
        // 包含@和.才认为输入完成
        return value.includes('@') && value.includes('.');
      },
      debounceMs: 600
    },
    phone: {
      validator: Validators.pattern(/^\d{11}$/),
      validateOnComplete: true,
      completeCondition: (value) => {
        // 输入满11位才验证
        return value.length === 11;
      },
      debounceMs: 200
    }
  }
});

默认完成条件

如果不提供 completeCondition,FormState 使用以下默认规则:

  • 字符串: value.trim().length > 0
  • 数字: !isNaN(value)
  • 数组: value.length > 0
  • 对象: value != null