鸿蒙开发(四):数据绑定与表单交互实践

目录

  • 一、实验内容
  • 二、开发过程与核心知识点
  • 三、运行结果
  • 四、学习总结

一、实验内容

本次实验目标是完成“编辑个人资料”页面的开发
整体效果:
在这里插入图片描述

具体要求如下:

  1. 页面包含姓名、年龄、性别、学号、密码五个输入项,其中性别使用Select组件,其余使用TextInput组件在这里插入图片描述

  2. 底部设置“保存”和“重置”两个按钮在这里插入图片描述

  3. 定义UserInfo接口规范数据结构,包含姓名、年龄、性别(二元类型)、学号、密码

  4. 创建myInfo对象存储用户信息,初始值为空

  5. 使用@State实现页面数据双向绑定,输入框内容实时同步到myInfo

  6. 点击“保存”按钮后,通过弹窗(promptAction)显示输入的信息在这里插入图片描述

  7. 点击“重置”按钮后,清空所有输入框内容

二、开发过程与核心知识点

1. 数据结构定义

// 定义用户信息接口
interface UserInfo {
  name: string;
  age: string;
  gender: '男' | '女'; // 二元类型,仅允许"男"或"女"
  student_ID: string;
  password: string;
}

知识点:通过TypeScript接口(interface)规范数据结构,使用联合类型('男' | '女')限制性别取值范围。

2. 响应式数据声明

@Entry
@Component
struct PersonInfo {
  // 用@State装饰器声明响应式对象,初始值为空
  @State myInfo: UserInfo = {
    name: '',
    age: '',
    gender: '男', // 默认性别为男
    student_ID: '',
    password: ''
  }
  // ...
}

知识点@State是ArkUI中的状态装饰器,用于声明组件内部的响应式数据。当数据发生变化时,依赖该数据的UI会自动更新,实现数据与UI的联动。

3. 表单组件实现

(1)姓名输入框
Row() {
  Text('姓名').padding({ right: 30 })
  TextInput({ 
    placeholder: '请输入姓名', 
    text: this.myInfo.name  // 绑定myInfo.name
  })
  .onChange((name) => {
    this.myInfo.name = name  // 输入变化时更新数据
  })
  .width('70%')
  .borderRadius(10)
}

知识点:TextInput组件通过text属性绑定数据(myInfo.name),onChange事件监听输入变化并同步更新数据,实现双向绑定。

(2)性别选择器(Select组件)
Row() {
  Text('性别').padding({ right: 30 })
  Select([{ value: '男' }, { value: '女' }])
    .value(this.myInfo.gender)  // 绑定当前选中值
    .onSelect((index, value) => {
      this.myInfo.gender = value as '男' | '女'  // 转换类型并更新数据
    })
    .width('70%')
    .borderRadius(10)
}

知识点:Select组件通过value属性绑定选中值,onSelect事件监听选择变化,将选中值同步到myInfo.gender。

(3)密码输入框(带加密显示)
Row() {
  Text('密码').padding({ right: 30 })
  TextInput({ 
    placeholder: '请输入密码', 
    text: this.myInfo.password 
  })
  .type(InputType.Password)  // 设置为密码类型,输入内容显示为圆点
  .onChange((password) => {
    this.myInfo.password = password
  })
  .width('70%')
  .borderRadius(10)
}

知识点:TextInput通过type(InputType.Password)设置为密码输入模式,保护敏感信息。

4. 按钮交互逻辑

(1)保存按钮(弹窗提示)
Button('保存')
  .width(140)
  .backgroundColor('#353a88')
  .onClick(() => {
    // 调用promptAction显示弹窗
    promptAction.showToast({
      message: `保存成功:\n姓名:${this.myInfo.name}\n年龄:${this.myInfo.age}\n性别:${this.myInfo.gender}\n学号:${this.myInfo.student_ID}\n密码:${this.myInfo.password}`
    })
  })

知识点promptAction.showToast用于显示轻量级弹窗,message属性支持换行符(\n)格式化文本,展示保存的用户信息。

(2)重置按钮(清空数据)
Button('重置')
  .width(140)
  .backgroundColor('#2d3f8b')
  .onClick(() => {
    // 重置myInfo所有属性为空(性别恢复默认值)
    this.myInfo.name = ''
    this.myInfo.age = ''
    this.myInfo.gender = '男'
    this.myInfo.student_ID = ''
    this.myInfo.password = ''
  })

知识点:通过点击事件(onClick)直接修改myInfo的属性值,由于数据被@State修饰,UI会自动同步更新,实现输入框清空效果。

5. 完整代码

// 导入弹窗工具
import { promptAction } from '@kit.ArkUI';

// 定义用户信息接口
interface UserInfo {
  name: string;
  age: string;
  gender: '男' | '女';
  student_ID: string;
  password: string;
}

@Entry
@Component
struct PersonInfo {
  // 响应式数据对象
  @State myInfo: UserInfo = {
    name: '',
    age: '',
    gender: '男',
    student_ID: '',
    password: ''
  }

  build() {
    Column() {
      // 顶部标题栏
      Row() {
        Image($r('app.media.ic_public_arrow_left')).width(30)
        Text('编辑个人资料')
          .fontSize(18)
          .fontWeight(FontWeight.Bold)
          .offset({ x: '25%' })
      }
      .width('100%')
      .padding(10)

      // Logo图片
      Image($r('app.media.HenuLogo')).width(140).padding({ top: 20, bottom: 40 })

      // 表单内容区
      Column() {
        // 姓名输入行
        Row() {
          Text('姓名').padding({ right: 30 })
          TextInput({ placeholder: '请输入姓名', text: this.myInfo.name })
            .onChange((name) => { this.myInfo.name = name })
            .width('70%')
            .borderRadius(10)
        }.width('100%').padding({ left: 25, bottom: 5 })

        // 年龄输入行
        Row() {
          Text('年龄').padding({ right: 30 })
          TextInput({ placeholder: '请输入年龄', text: this.myInfo.age })
            .onChange((age) => { this.myInfo.age = age })
            .width('70%')
            .borderRadius(10)
        }.width('100%').padding({ left: 25, bottom: 5 })

        // 性别选择行
        Row() {
          Text('性别').padding({ right: 30 })
          Select([{ value: '男' }, { value: '女' }])
            .value(this.myInfo.gender)
            .onSelect((index, value) => { this.myInfo.gender = value as '男' | '女' })
            .width('70%')
            .borderRadius(10)
        }.width('100%').padding({ left: 25, bottom: 5 })

        // 学号输入行
        Row() {
          Text('学号').padding({ right: 30 })
          TextInput({ placeholder: '请输入学号', text: this.myInfo.student_ID })
            .onChange((ID) => { this.myInfo.student_ID = ID })
            .width('70%')
            .borderRadius(10)
        }.width('100%').padding({ left: 25, bottom: 5 })

        // 密码输入行
        Row() {
          Text('密码').padding({ right: 30 })
          TextInput({ placeholder: '请输入密码', text: this.myInfo.password })
            .type(InputType.Password)
            .onChange((password) => { this.myInfo.password = password })
            .width('70%')
            .borderRadius(10)
        }.width('100%').padding({ left: 25, bottom: 25 })

        // 按钮行
        Row({ space: 10 }) {
          Button('保存')
            .width(140)
            .backgroundColor('#353a88')
            .onClick(() => {
              promptAction.showToast({
                message: `保存成功:\n姓名:${this.myInfo.name}\n年龄:${this.myInfo.age}\n性别:${this.myInfo.gender}\n学号:${this.myInfo.student_ID}\n密码:${this.myInfo.password}`
              })
            })

          Button('重置')
            .width(140)
            .backgroundColor('#2d3f8b')
            .onClick(() => {
              this.myInfo = {
                name: '',
                age: '',
                gender: '男',
                student_ID: '',
                password: ''
              }
            })
        }
      }
    }
  }
}

三、运行结果

页面运行后呈现以下效果:

  1. 初始状态:所有输入框为空,性别默认选中“男”
  2. 输入交互:在输入框中填写信息时,内容实时同步到myInfo对象
  3. 保存功能:点击“保存”后,弹窗显示完整的用户信息(姓名、年龄、性别、学号、密码)
  4. 重置功能:点击“重置”后,所有输入框清空,性别恢复为默认值“男”

四、学习总结

掌握的知识点

  1. 学会使用TypeScript接口定义数据结构,规范数据格式
  2. 理解并应用@State装饰器实现数据双向绑定,确保UI与数据同步
  3. 掌握TextInput(含密码类型)和Select组件的使用,实现表单输入
  4. 学会使用promptAction.showToast显示弹窗提示,反馈用户操作结果
  5. 通过按钮点击事件实现数据保存与重置逻辑

遇到的问题及解决思路

  1. 问题promptAction.showToastshowToast被划横线,提示写法老旧
    说明:可能是API版本更新导致方法名称或参数变化,需查阅最新官方文档确认新的弹窗调用方式(如prompt.showToast

本次实验聚焦于表单交互与数据管理,通过响应式状态实现了页面的动态更新,为后续更复杂的用户交互功能奠定了基础。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐