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. 布局构建

  • 采用ColumnRow等容器组件
  • 配合TextInputButton等基础组件构建界面

3. 样式定义

  • 通过链式调用方式
  • 或使用独立的style对象进行定义

4. 事件处理

  • 使用onClick等回调函数处理用户交互

源码结构

主要包含三个部分:

  1. 组件定义
  2. 样式设置
  3. 事件绑定

更多关于HarmonyOS鸿蒙Next中自定义登录表单组件-附源码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个很实用的HarmonyOS Next登录表单实现。代码结构清晰,展示了ArkUI声明式开发的核心特性。

关键实现分析:

  1. 状态管理:使用@State装饰器管理表单数据和错误状态,实现了数据驱动的UI更新。
  2. 表单校验validateForm()方法处理实时校验逻辑,包括空值检查和密码长度验证。
  3. 响应式UI:通过opacity()控制错误提示的显示/隐藏,用户体验流畅。
  4. 类型安全:引入了LoginFormLoginState类型定义,增强了代码可维护性。

可优化建议:

  • 密码校验逻辑可以移到onChange中实现实时反馈,而不是仅在提交时检查。
  • 手机号格式验证(如正则表达式)可以增强表单的健壮性。
  • 考虑使用@Link@Prop将表单组件抽离为可复用子组件。

HarmonyOS Next特性应用:

  • 正确使用了ArkUI的router进行页面导航
  • 采用promptAction.showToast进行用户提示
  • 资源引用方式$r()符合HarmonyOS开发规范

这个实现为HarmonyOS应用的基础登录功能提供了很好的参考模板,稍作扩展即可用于实际项目。

回到顶部