HarmonyOS 教学实战(六):复杂表单与校验体系(把“最难写”的模块写优雅)

如果你写过表单,一定有过这种体验:

  • 校验逻辑散落在各个按钮里

  • 一个字段改规则,要改 5 个地方

  • UI 和校验代码混在一起

  • 状态一多,表单直接失控

这篇文章的目标只有一个:

教你用 HarmonyOS 的正确方式,写一个"可维护、可扩展、不崩盘"的复杂表单体系


一、真实项目中的"复杂表单"长什么样?

我们以一个用户资料编辑页为例,字段包括:

  • 用户名(必填,长度限制)

  • 手机号(格式校验)

  • 邮箱(格式校验)

  • 年龄(范围校验)

  • 是否接收通知(开关)

  • 提交前整体校验

  • 错误提示实时反馈

📌 这已经是一个中等复杂度的真实表单


二、先说结论:表单该怎么设计?

一句话总结:

表单 = 状态模型 + 校验规则 + UI 映射

而不是:

❌ 一堆 TextInput + onClick 判断


三、第一步:定义表单数据模型(核心)

model/ProfileFormModel.ets

复制代码
@ObservedV2
export class ProfileForm {
  name: string = ''
  phone: string = ''
  email: string = ''
  age: number = 0
  notify: boolean = false

  errors: Record<string, string> = {}
}

📌 表单数据

📌 错误信息

📌 都集中在一个模型里


四、第二步:封装校验规则(非常关键)

不要把校验写在 UI 里。

service/FormValidator.ets

复制代码
export class FormValidator {
  static validateName(name: string): string {
    if (!name) return '用户名不能为空'
    if (name.length < 2) return '用户名至少 2 个字符'
    return ''
  }

  static validatePhone(phone: string): string {
    const reg = /^1\d{10}$/
    if (!reg.test(phone)) return '手机号格式不正确'
    return ''
  }

  static validateEmail(email: string): string {
    if (!email.includes('@')) return '邮箱格式不正确'
    return ''
  }

  static validateAge(age: number): string {
    if (age <= 0 || age > 120) return '年龄不合法'
    return ''
  }
}

📌 校验逻辑完全与 UI 解耦

📌 后续规则变更只改这一处


五、第三步:在 Store 中统一调度校验

store/ProfileFormStore.ets

复制代码
import { ProfileForm } from '../model/ProfileFormModel'
import { FormValidator } from '../service/FormValidator'

@ObservedV2
export class ProfileFormStore {
  form = new ProfileForm()

  validateField(field: string) {
    let msg = ''
    switch (field) {
      case 'name':
        msg = FormValidator.validateName(this.form.name)
        break
      case 'phone':
        msg = FormValidator.validatePhone(this.form.phone)
        break
      case 'email':
        msg = FormValidator.validateEmail(this.form.email)
        break
      case 'age':
        msg = FormValidator.validateAge(this.form.age)
        break
    }
    this.form.errors[field] = msg
  }

  validateAll(): boolean {
    this.validateField('name')
    this.validateField('phone')
    this.validateField('email')
    this.validateField('age')

    return Object.values(this.form.errors).every(v => !v)
  }
}

📌 UI 不做判断

📌 UI 只展示结果

📌 校验入口统一


六、第四步:表单页面实现(UI 只负责"映射")

pages/ProfileEdit.ets

复制代码
@ComponentV2
struct ProfileEdit {
  @Local store = new ProfileFormStore()

  build() {
    Column({ space: 12 }) {

      TextInput({ placeholder: '用户名' })
        .onChange(v => {
          this.store.form.name = v
          this.store.validateField('name')
        })
      this.errorText('name')

      TextInput({ placeholder: '手机号' })
        .onChange(v => {
          this.store.form.phone = v
          this.store.validateField('phone')
        })
      this.errorText('phone')

      TextInput({ placeholder: '邮箱' })
        .onChange(v => {
          this.store.form.email = v
          this.store.validateField('email')
        })
      this.errorText('email')

      TextInput({ placeholder: '年龄', type: InputType.Number })
        .onChange(v => {
          this.store.form.age = Number(v)
          this.store.validateField('age')
        })
      this.errorText('age')

      Toggle({ isOn: this.store.form.notify })
        .onChange(v => this.store.form.notify = v)

      Button("提交")
        .onClick(() => {
          if (this.store.validateAll()) {
            console.log('提交成功', this.store.form)
          }
        })
    }
    .padding(16)
  }

  errorText(field: string) {
    const msg = this.store.form.errors[field]
    if (msg) {
      Text(msg).fontColor(Color.Red).fontSize(12)
    }
  }
}

七、为什么这种表单结构"不容易烂"?

因为它满足了 5 个关键原则:

  1. 状态集中(Form Model)

  2. 校验解耦(Validator)

  3. 逻辑统一(Store)

  4. UI 纯展示

  5. 规则可扩展


八、进阶:实时校验 vs 提交校验

你可以轻松控制策略:

场景 做法
实时校验 onChange 调 validateField
失焦校验 onBlur 调 validateField
提交校验 validateAll

📌 不需要改 UI 结构


九、复杂表单常见"灾难级写法"(避坑)

❌ 校验写在 onClick 里

一多就失控

❌ 每个字段一个 @Local error

状态爆炸

❌ UI 直接写正则

维护噩梦


十、这一篇你真正学会了什么?

你已经掌握:

✔ HarmonyOS 表单建模思维

✔ 表单校验体系设计

✔ UI / 逻辑 / 规则解耦

✔ 可扩展的表单架构

这套方法:

不仅适用于 HarmonyOS,也适用于 Vue / React / Flutter


结语

表单写得好不好,是区分"Demo 开发者"和"工程型开发者"的分水岭。

能走到这一篇,你已经明显进入 中高级 HarmonyOS 开发者的轨道了。

相关推荐
HMS Core4 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 — Form Kit
华为·harmonyos
IT充电站5 小时前
鸿蒙应用开发之鸿蒙沙箱文件如何存媒体库?
harmonyos
IT充电站5 小时前
鸿蒙应用开发之通过AVPlayer如何实现音乐播放、暂停、音量设置?
harmonyos
HMS Core5 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 — Share Kit
华为·harmonyos
昼-枕7 小时前
鸿蒙Flutter实战:构建智能健身教练应用
flutter·华为·harmonyos
昼-枕7 小时前
鸿蒙与 Flutter 的融合探索:跨平台开发的新可能
flutter·华为·harmonyos
特立独行的猫a7 小时前
鸿蒙PC三方库移植:zlib数据压缩库的适配实践
华为·harmonyos·移植·zlib·鸿蒙pc
AirDroid_cn7 小时前
鸿蒙NEXT:平板作为扩展屏时,触摸延迟如何优化?
华为·电脑·harmonyos
wtrees_松阳8 小时前
【弦绝九章】HarmonyOS异步心法:asynchronous插件详解
华为·harmonyos