当前位置: 首页 > news >正文

HarmonyOS7 TextInput 表单:输入校验与提交最佳实践

文章目录

    • 前言
    • 基础绑定
      • 代码实现
    • 实时校验:边输入边提示
      • 核心代码
      • 完整示例
    • 提交时统一拦截
      • 代码解析
    • 用 @Builder 抽一个带校验的输入框
      • 实现拆解
    • 常见误区(小白必踩)
    • 完整可运行示例:表单校验
      • 代码清单
    • 写在最后

前言

登录、注册、反馈、下单——几乎所有 app 都有表单。表单最烦的不是布局,而是输入校验:手机号对不对、密码够不够长、两次密码一不一致。

这篇文章我把一个"注册表单"从头写到尾,重点讲怎么在用户输入时就做校验、怎么在提交时统一拦截。照着这套写,你的表单不会再出现"点了提交才告诉我格式错"。

基础绑定

TextInput通过textonChange跟状态双向绑定:

代码实现

@Localphone:string=''@Localpwd:string=''build(){Column({space:12}){TextInput({placeholder:'请输入手机号',text:this.phone}).onChange((v)=>{this.phone=v}).type(InputType.PhoneNumber)// 弹出数字键盘TextInput({placeholder:'请输入密码',text:this.pwd}).onChange((v)=>{this.pwd=v}).type(InputType.Password)// 密码遮罩}.padding(16)}

要点:

  • .type(InputType.PhoneNumber):手机号输入框弹数字键盘,体验更好。
  • .type(InputType.Password):密码输入显示圆点遮罩。
  • onChange里更新状态,这是表单数据收集的命脉。

实时校验:边输入边提示

不要等提交才校验。用户输入时即时判断并显示错误:

核心代码

@LocalphoneError:string=''privatevalidatePhone(v:string){if(v.length===0){this.phoneError='手机号不能为空'}elseif(!/^1[3-9]\d{9}$/.test(v)){this.phoneError='手机号格式不正确'}else{this.phoneError=''// 通过,清空错误}}// 在 onChange 里调用.onChange((v)=>{this.phone=vthis.validatePhone(v)})

配合界面上的错误提示:

完整示例

if(this.phoneError){Text(this.phoneError).fontSize(12).fontColor('#FF0000')}

这样用户输入的瞬间就能看到红字提示,体验远胜"提交后才报错"。

提交时统一拦截

点提交时,把所有字段再校验一遍,只有全过才发请求:

代码解析

asyncfunctionsubmit(){this.validatePhone(this.phone)if(this.phoneError||this.pwd.length<6){promptAction.showToast({message:'请检查输入'})return// 有错就拦住,不发请求}// 全部通过,提交awaitthis.doRegister(this.phone,this.pwd)}
  • 提交前再校验一次,防止用户绕过实时校验(比如直接点了提交)。
  • 任何一项不通过就return,不发请求。这是表单的"最后一道防线"。

用 @Builder 抽一个带校验的输入框

表单字段多,重复代码多。抽一个通用输入框组件:

实现拆解

@BuilderValidatedInput(placeholder:string,value:string,error:string,onVal:(v:string)=>void){Column(){TextInput({placeholder:placeholder,text:value}).onChange(onVal)if(error){Text(error).fontSize(12).fontColor('#FF0000')}}}// 使用:// this.ValidatedInput('手机号', this.phone, this.phoneError, v => { this.phone = v; this.validatePhone(v) })

一个ValidatedInput复用到所有字段,注册、登录、反馈表单全通用。

常见误区(小白必踩)

误区说明
不实时校验等提交才报错,用户体验差。用户输入瞬间就该红字提示。
提交不统一拦截实时校验可能被绕过(比如直接点提交),提交时再校验一次是最后防线。
type不设导致键盘错手机号用InputType.PhoneNumber弹数字键盘,密码用Password遮罩。

下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。

完整可运行示例:表单校验

实时校验手机号格式,校验通过才允许提交。

代码清单

// TextInput 输入校验@Entry@Componentstruct Form{@Statephone:string=''@Stateerr:string=''privatecheck(v:string){if(!/^1\d{10}$/.test(v)){this.err='请输入 11 位手机号'}else{this.err=''// 通过则清空错误}}build(){Column({space:12}){TextInput({placeholder:'手机号'}).onChange((v)=>{this.phone=v;this.check(v)})if(this.err){Text(this.err).fontColor('#E53935').fontSize(12)}Button('提交').enabled(this.err===''&&this.phone.length>0)}.padding(20)}}

你会看到什么:输入非手机号时下方立刻显示红色错误提示,且「提交」按钮变灰不可点;格式正确后提示消失、按钮恢复可点。

动手改一改

  • 把正则换成邮箱校验/^\S+@\S+\.\S+$/
  • TextInput({ text: $$this.phone } })双向绑定简化状态。
  • 给错误提示加transition让它平滑出现。

写在最后

表单校验的黄金法则:实时校验给即时反馈,提交时再统一拦截。两者缺一不可——实时校验管体验,提交拦截管安全。

把校验逻辑(手机号正则、密码长度)抽成独立函数,配合ValidatedInput复用,你的表单代码会清爽一大截。下次写表单,先把这些工具备好再动手。

http://www.jsqmd.com/news/1180250/

相关文章:

  • 3分钟解决GitHub下载慢:Fast-GitHub终极加速指南
  • 揭秘Wallpaper Engine资源解包:RePKG工具全面探索指南
  • ShaderGraph位置节点全解析:从坐标空间到屏幕特效实战
  • 耐根穿刺型排水保护异型片(自粘土工布)生产企业推荐指南 - 排水板厂家
  • DownGit终极指南:如何精准下载GitHub文件夹的5个实用技巧
  • 终极指南:如何使用Awoo Installer高效安装Switch游戏
  • 如何快速使用openeuler/passwd_group_generator创建/etc/passwd和/etc/group文件?终极指南
  • Python 作业报错“list index out of range”怎么调试
  • 2026甄选top5上饶名表名包奢侈品回收欧米茄帝舵积家香奈儿罗意威圣罗兰甄选top5标杆推荐 - 谊识预商贸
  • 基于51单片机红外计数器人数流量统计无线蓝牙/WiFi/视频监控APP设计DIY-D167X
  • Three.js 纹理内存管理:压缩纹理格式选择、Mipmap 策略与 GPU 带宽优化
  • (带登陆系统)基于深度学习的中草药识别系统312(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • Windows系统文件concrt140.dll丢失找不到问题解决
  • SpringBoot 3.x Controller 传参:Map vs DTO 在 5 个维度的性能与可维护性对比
  • 从镜头参数到地面精度:航测相机选型与分辨率实战指南
  • DownGit:GitHub精准下载神器,告别整库克隆的烦恼
  • 塑料蓄排水板生产企业推荐指南(工程招投标采购完整版) - 排水板厂家
  • 【ChatGPT代码调试黄金法则】:20年资深工程师亲授5大避坑技巧,93%开发者从未用对的3个Prompt指令
  • 卡诺图化简实战:从4变量真值表到最简与或式,3步完成电路优化
  • 2026甄选top5乌海名表名包奢侈品回收帝舵浪琴宝珀路易威登LV古驰罗意威甄选top5权威推荐 - 谊识预商贸
  • Windows系统文件configmanager2.dll丢失找不到问题解决
  • ipconfig /all 深度解析:从15个字段读懂Windows网络配置全貌
  • 人脸识别系统 42(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • UltraEdit高效使用指南:从正则到十六进制,7个让你效率翻倍的技巧
  • 3种图像骨架提取算法对比:Zhang-Suen vs Guo-Hall vs Morphological Thinning
  • 直流有刷电机驱动方案:TC78H653FTG与STM32F745ZG组合应用
  • Ubuntu22.04部署Nvidia 550驱动与CUDA 12.4.1:从零搭建AI开发环境
  • 工业负载控制方案:TPD2015FN与PIC18F86K22的实战应用
  • HTTPS/TLS 1.3 握手流程详解:从 Client Hello 到 Finished 的 7 步拆解
  • 微服务架构下的分布式追踪——OpenTelemetry 在 Spring 生态的落地