鸿蒙原生开发手记:徒步迹 - 登录注册页面与表单校验
鸿蒙原生开发手记徒步迹 - 登录注册页面与表单校验实现完整的用户认证流程包含表单验证和交互反馈一、前言登录注册是绝大多数 App 的入口功能。本文实现“徒步迹“的登录注册页面包含手机号输入、密码输入、表单校验、Loading 状态等完整交互。二、登录页面实现2.1 布局设计登录页分为三个区域标题区品牌问候语表单区手机号、密码输入操作区登录按钮、注册入口2.2 完整代码Entry Component struct LoginPage { State private phone: string ; State private password: string ; State private showPassword: boolean false; State private isLoading: boolean false; State private errorMsg: string ; build() { Column() { // 1. 标题区 Column() { Text(欢迎回来) .fontSize(28) .fontWeight(FontWeight.Bold) .fontColor($r(app.color.text_primary)) .width(100%); Text(登录徒步迹开始你的徒步之旅) .fontSize(15) .fontColor($r(app.color.text_secondary)) .width(100%) .margin({ top: 8 }); } .width(100%) .padding({ top: 60, bottom: 40 }) .alignItems(HorizontalAlign.Start); // 2. 表单区 // 手机号 TextInput({ placeholder: 请输入手机号, text: this.phone }) .width(100%) .height(50) .backgroundColor($r(app.color.background_color)) .borderRadius(12) .padding({ left: 16 }) .type(InputType.PhoneNumber) .maxLength(11) .onChange((value: string) { this.phone value; this.errorMsg ; }); // 密码带显示/隐藏切换 Row() { TextInput({ placeholder: 请输入密码, text: this.password }) .layoutWeight(1) .backgroundColor(Color.Transparent) .type(this.showPassword ? InputType.Normal : InputType.Password) .onChange((value: string) { this.password value; this.errorMsg ; }); // 密码可见切换 Text(this.showPassword ? : ️) .fontSize(20) .margin({ right: 16 }) .onClick(() { this.showPassword !this.showPassword; }); } .width(100%).height(50) .backgroundColor($r(app.color.background_color)) .borderRadius(12) .margin({ top: 16 }); // 错误提示 if (this.errorMsg) { Text(this.errorMsg) .fontSize(13) .fontColor($r(app.color.error_color)) .width(100%) .margin({ top: 8 }); } // 忘记密码 Text(忘记密码) .fontSize(14) .fontColor($r(app.color.primary_color)) .width(100%) .textAlign(TextAlign.End) .margin({ top: 12 }); // 3. 登录按钮 Button() { if (this.isLoading) { LoadingProgress().width(24).height(24).color(Color.White); } else { Text(登录).fontSize(16).fontColor(Color.White); } } .width(100%).height(50) .backgroundColor($r(app.color.primary_color)) .borderRadius(25) .margin({ top: 32 }) .enabled(this.isFormValid() !this.isLoading) .onClick(() this.handleLogin()); // 注册入口 Row() { Text(还没有账号).fontSize(14).fontColor(#999); Text(立即注册) .fontSize(14) .fontColor($r(app.color.primary_color)) .onClick(() { router.pushUrl({ url: pages/RegisterPage }); }); } .margin({ top: 24 }) .justifyContent(FlexAlign.Center); } .width(100%).height(100%) .padding({ left: 24, right: 24 }) .backgroundColor(Color.White); } // 表单校验 isFormValid(): boolean { return this.phone.length 11 this.password.length 6; } // 登录逻辑 handleLogin(): void { // 前端校验 if (!/^1[3-9]\d{9}$/.test(this.phone)) { this.errorMsg 请输入正确的手机号; return; } if (this.password.length 6) { this.errorMsg 密码至少6位; return; } this.isLoading true; // 模拟登录请求 setTimeout(() { this.isLoading false; // 登录成功保存 token AppStorage.setOrCreate(isLogged, true); router.replaceUrl({ url: pages/HomePage }); }, 1500); } }三、表单校验最佳实践3.1 手机号格式校验function validatePhone(phone: string): boolean { return /^1[3-9]\d{9}$/.test(phone); } function validatePassword(password: string): { valid: boolean; msg: string } { if (password.length 6) { return { valid: false, msg: 密码至少6位 }; } if (!/[A-Za-z]/.test(password)) { return { valid: false, msg: 密码需包含字母 }; } if (!/\d/.test(password)) { return { valid: false, msg: 密码需包含数字 }; } return { valid: true, msg: }; }3.2 实时校验使用 Watch 监听输入变化实时校验Component struct FormField { State Watch(validate) value: string ; State error: string ; Prop label: string ; Prop rules: ((v: string) string | null)[] []; validate(): void { for (let rule of this.rules) { const err rule(this.value); if (err) { this.error err; return; } } this.error ; } build() { Column() { TextInput({ placeholder: 请输入${this.label}, text: this.value }) .onChange((v) { this.value v; }); if (this.error) { Text(this.error).fontSize(12).fontColor(#F44336); } } } }四、用户体验优化4.1 Loading 状态登录按钮在请求中禁用并显示加载动画Button() { if (this.isLoading) { LoadingProgress().width(24).height(24).color(Color.White); } else { Text(登录).fontSize(16).fontColor(Color.White); } } .enabled(!this.isLoading this.isFormValid())4.2 键盘处理// 点击空白区域收起键盘 Column() .onClick(() { inputMethod.getController()?.stopInputSession(); })4.3 验证码倒计时State countdown: number 0; startCountdown(): void { this.countdown 60; const interval setInterval(() { this.countdown--; if (this.countdown 0) { clearInterval(interval); } }, 1000); }五、数据流说明用户输入 ↓ 表单校验 ← Watch 实时监听 ↓ 通过 调用 API ↓ 保存 Token → AppStorage ↓ 更新登录状态 → Provide(isLogged) ↓ 路由跳转 → HomePage六、总结登录注册页面是 App 的基础功能。本文实现了一个包含完整校验和交互反馈的登录页表单校验、Loading 状态、密码可见切换等交互都能直接用于“徒步迹“ App。下一篇文章将实现验证码登录和忘记密码功能。下一篇预告鸿蒙原生开发手记徒步迹 - 验证码登录与忘记密码

相关新闻

卡梅德生物技术快报|fab合成文库:Fab 合成文库搭建全流程优化与筛选性能量化分析

卡梅德生物技术快报|fab合成文库:Fab 合成文库搭建全流程优化与筛选性能量化分析

正文一、行业实验痛点:传统抗体库体系存在多重限制性问题在蛋白互作、靶向结合试剂开发的常规实验流程中,抗体片段筛选是核心前置环节。现阶段实验室主流采用免疫杂交瘤、天然 B 细胞抗体库两类技术路线,但长期实操中暴露出无法适配现代高通量…

2026/7/17 0:34:20 阅读更多 →
我不介意被人讨厌,渴望被人喜欢才是弱点:选工作不用听亲戚说体不体面;过日子不用听别人评价会遵守社会规范,自己的体验最重要,同样对方也要有这个意识

我不介意被人讨厌,渴望被人喜欢才是弱点:选工作不用听亲戚说体不体面;过日子不用听别人评价会遵守社会规范,自己的体验最重要,同样对方也要有这个意识

我不介意被人讨厌:渴望被喜欢,才是一个人最大的弱点 目录 我不介意被人讨厌:渴望被喜欢,才是一个人最大的弱点 穿衣服:舒服比“别人眼里的好看”重要 选工作:需求比“别人嘴里的体面”重要:其实根本没有什么好工作:因为好工作轮不到你,你不知道是不是好工作就是坏工作…

2026/7/17 0:28:17 阅读更多 →
2026年7月戴尔服务器回收Top榜:哪家靠谱?优缺点深度测评

2026年7月戴尔服务器回收Top榜:哪家靠谱?优缺点深度测评

你是否也在为闲置的戴尔服务器找不到合适的归宿而焦虑?担心回收价格被压得太低,又怕数据泄露带来安全隐患? 现如今, 数字化转型进程加速时, 企业 IT 设备更新换代频率特别高, 要是大量退役的 PowerEdge 服务器处理不妥当, 不但会造成资源浪费…

2026/7/17 0:24:15 阅读更多 →

最新新闻

Windows自带光盘刻录功能详解与实用技巧

Windows自带光盘刻录功能详解与实用技巧

1. Windows自带光盘刻录功能详解在Windows 10/11系统中,微软内置了一个简单实用的光盘刻录工具,无需安装第三方软件即可完成基本的光盘刻录任务。这个功能虽然看起来简单,但包含了几个关键的技术实现:UDF文件系统支持:…

2026/7/17 1:18:38 阅读更多 →
解决Windows 10安装错误0x8007042b的磁盘空间问题

解决Windows 10安装错误0x8007042b的磁盘空间问题

1. 错误0x8007042b的根源分析遇到Windows 10安装失败并提示0x8007042b错误代码时,90%的情况都是磁盘空间不足导致的。这个错误码在Windows系统中专门用于表示"磁盘空间不足"的操作系统级错误。当系统分区或临时文件分区剩余空间小于升级所需的最小值时&am…

2026/7/17 1:18:37 阅读更多 →
三步解密QQ音乐加密音频:qmcdump终极使用指南

三步解密QQ音乐加密音频:qmcdump终极使用指南

三步解密QQ音乐加密音频:qmcdump终极使用指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经在Q…

2026/7/17 1:14:37 阅读更多 →
[Bug已解决] F.batch_norm 多维偏置下 eager 与 torch.compile 结果不一致(Dynamo)解决方案

[Bug已解决] F.batch_norm 多维偏置下 eager 与 torch.compile 结果不一致(Dynamo)解决方案

[Bug已解决] F.batch_norm 多维偏置下 eager 与 torch.compile 结果不一致(Dynamo)解决方案 一、现象长什么样 你用 torch.nn.functional.batch_norm(或带偏置的 BatchNorm,其中 bias 是多维的,而非标准的 1D&#x…

2026/7/17 1:12:36 阅读更多 →
一分钟搞定!Windows电脑终于能识别你的iPhone了![特殊字符]

一分钟搞定!Windows电脑终于能识别你的iPhone了![特殊字符]

一分钟搞定!Windows电脑终于能识别你的iPhone了!🍎 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https:/…

2026/7/17 1:10:36 阅读更多 →
【GraphRAG+Neo4j +TRAE】零代码打造基于知识图谱的本地知识库,实现知识图谱可视化

【GraphRAG+Neo4j +TRAE】零代码打造基于知识图谱的本地知识库,实现知识图谱可视化

一、项目概述 项目名称:GraphRAG知识图谱可视化——以《红楼梦》为测试文本 核心目标:利用知识图谱中的结构化关系信息,辅助模型更精准地理解查询意图,并在海量数据中找到最相关的信息进行生成。 🧠技术原理&#x…

2026/7/17 1:08:36 阅读更多 →

日新闻

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行,含零代码SAAS、AI编程、源码定制

2026全国外贸独立站搭建公司推荐排行 外贸工厂、工贸企业建设官网,核心需求与普通展示型网站并不相同。除了页面整洁、多语言适配和海外访问体验,企业还要重点考虑数据能否导出、站点能否迁移、源码是否可控、后续费用是否透明,以及更换服务…

2026/7/17 0:02:10 阅读更多 →
HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

HarmonyOS 应用开发《掌上英语》第19篇:3D 翻转动画实现——ArkTS 动画系统全解析

3D 翻转动画实现——ArkTS 动画系统全解析引言 在移动应用中,卡片翻转动画是最受欢迎的交互动效之一,它能给用户带来直观的"物理世界"操作感。在我们的英语学习 App 的单词学习页面(CourseHomePage.ets)中,就…

2026/7/17 0:02:10 阅读更多 →
2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

2026键盘推荐|IQUNIX EV63多场景适配,不允许有人不知道!

现在很多用户都需要一款能适配多场景的键盘,既能满足交流码字的需求,又能应对居家电竞的性能需求,最好还得有点小颜值。而大多键盘都只能兼顾其中一两个场景。这次我实测了IQUNIX EV63三款配色(银武士、黑武士、紫罗兰&#xff09…

2026/7/17 0:04:10 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/16 23:40:37 阅读更多 →

月新闻