HarmonyOS鸿蒙Next中自定义登录表单组件-附源码
HarmonyOS鸿蒙Next中自定义登录表单组件-附源码
登录界面效果
校验不通过
这里validateForm 方法内部逻辑还可以更丰富,比如校验密码强度,密码字符串组成等等,可以在这里扩展就可以用了。

校验通过

源码
// 登录
import { CONSTANT } from '../../constant/Constant';
import { router } from '@kit.ArkUI';
import { LoginForm,LoginState } from '../../models/Login';
import { promptAction } from '@kit.ArkUI';
@Entry
@Component
struct Login {
@State formData:LoginForm = {
phone: '',
password: ''
}
@State loginError:LoginState = {
isPhone:false,
phoneErrorText: '手机号不能为空!',
isPassword:false,
passwordErrorText: '密码不能为空!'
}
// 表单项校验
validateForm ():boolean{
let isPass = false
const phone = this.formData.phone.trim()
const password = this.formData.password.trim()
this.loginError.isPhone = !phone
this.loginError.isPassword = !password
if (password.length < 5) {
promptAction.showToast({
message: '密码长度必须大于5且小于等于12个字符串'
})
this.loginError.passwordErrorText = '密码长度不够'
this.loginError.isPassword = true
} else {
this.loginError.passwordErrorText = '密码不能为空!'
}
if (!this.loginError.isPhone&&!this.loginError.isPassword) {
isPass = true
} else isPass = false
return isPass;
}
build() {
Column(){
Row() {
Image($r('app.media.back'))
.fillColor(Color.Blue)
.margin({ left: CONSTANT.COMMON_DISTANCE })
.onClick(() => {
router.back();
})
.width(CONSTANT.STATIC_ICON_SIZE)
.height(CONSTANT.STATIC_ICON_SIZE)
.objectFit(ImageFit.Contain)
}
.justifyContent(FlexAlign.Start)
.width(CONSTANT.FULL_SIZE)
Image($r('app.media.startIcon')).objectFit(ImageFit.Auto).width($r('app.float.logo_image_size')).height($r('app.float.logo_image_size'))
Text('登录界面').fontSize($r('app.float.logo_title_text_size')).fontWeight(FontWeight.Bold).padding(CONSTANT.COMMON_DISTANCE)
Text('登录账号以使用更多服务').fontColor(Color.Grey)
Column({space: 8}) {
TextInput({placeholder:'请输入手机号'}).maxLength(12).type(InputType.PhoneNumber)
.onChange((value:string) => {
this.formData.phone = value
})
Text(this.loginError.phoneErrorText).fontColor(Color.Red).opacity(this.loginError.isPhone?1:0)
TextInput({placeholder:'请输入密码'}).maxLength(12).type(InputType.Password)
.onChange((value:string) => {
this.formData.password = value
})
Text(this.loginError.passwordErrorText).fontColor(Color.Red).opacity(this.loginError.isPassword?1:0)
}.alignItems(HorizontalAlign.Start).margin({top:20,bottom:20})
Row() {
Text('短信验证码登录').fontColor($r('app.color.font_color_blue'))
Text('忘记密码').fontColor($r('app.color.font_color_blue'))
}.width(CONSTANT.FULL_SIZE).justifyContent(FlexAlign.SpaceBetween)
Button() {
Text('登录').fontColor('#fff')
}.width('80%').height(36).margin({top:50,bottom: 20})
.onClick(() => {
if(this.validateForm()) {
console.log('校验通过')
promptAction.showToast({ message:"欢迎使用鸿蒙APP", duration: 3 })
setTimeout(() => router.pushUrl({ url: 'pages/Index'}), 3)
} else {
console.log('校验失败')
}
})
Text('注册账号').fontColor($r('app.color.font_color_blue'))
}.margin({left:CONSTANT.COMMON_MARGIN_SIZE_TWENTY, right:CONSTANT.COMMON_MARGIN_SIZE_TWENTY})
}
}
更多关于HarmonyOS鸿蒙Next中自定义登录表单组件-附源码的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
HarmonyOS Next自定义登录表单组件开发指南
开发方式
采用ArkTS声明式UI进行开发。
核心实现
1. 组件定义
- 使用
@Component装饰器定义自定义组件 - 结合
@Prop、@Link等状态管理装饰器实现数据绑定
2. 布局构建
- 采用
Column、Row等容器组件 - 配合
TextInput、Button等基础组件构建界面
3. 样式定义
- 通过链式调用方式
- 或使用独立的style对象进行定义
4. 事件处理
- 使用
onClick等回调函数处理用户交互
源码结构
主要包含三个部分:
- 组件定义
- 样式设置
- 事件绑定
更多关于HarmonyOS鸿蒙Next中自定义登录表单组件-附源码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个很实用的HarmonyOS Next登录表单实现。代码结构清晰,展示了ArkUI声明式开发的核心特性。
关键实现分析:
- 状态管理:使用
@State装饰器管理表单数据和错误状态,实现了数据驱动的UI更新。 - 表单校验:
validateForm()方法处理实时校验逻辑,包括空值检查和密码长度验证。 - 响应式UI:通过
opacity()控制错误提示的显示/隐藏,用户体验流畅。 - 类型安全:引入了
LoginForm和LoginState类型定义,增强了代码可维护性。
可优化建议:
- 密码校验逻辑可以移到
onChange中实现实时反馈,而不是仅在提交时检查。 - 手机号格式验证(如正则表达式)可以增强表单的健壮性。
- 考虑使用
@Link或@Prop将表单组件抽离为可复用子组件。
HarmonyOS Next特性应用:
- 正确使用了ArkUI的
router进行页面导航 - 采用
promptAction.showToast进行用户提示 - 资源引用方式
$r()符合HarmonyOS开发规范
这个实现为HarmonyOS应用的基础登录功能提供了很好的参考模板,稍作扩展即可用于实际项目。

