「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用

简介: 本篇教程将介绍如何创建一个模拟记账应用,通过账单输入、动态列表展示和实时统计功能,学习接口定义和组件间的数据交互。

本篇教程将介绍如何创建一个模拟记账应用,通过账单输入、动态列表展示和实时统计功能,学习接口定义和组件间的数据交互。

20250101_212803.gif


关键词
  • UI互动应用
  • 接口定义
  • 动态列表
  • 实时统计
  • 数据交互

一、功能说明

模拟记账应用包含以下功能:

  1. 账单输入:用户可以输入账单名称和金额。
  2. 账单列表展示:动态展示输入的账单内容。
  3. 账单移除:支持删除指定账单。
  4. 总金额统计:实时统计账单总金额并动态展示。

二、所需组件

  • @Entry@Component 装饰器
  • TextInputButton 组件完成账单输入与操作
  • ListListItem 组件用于账单展示
  • TextImage 组件用于展示账单内容、总金额及图片装饰
  • @State 修饰符用于状态管理

三、项目结构

  • 项目名称AccountingApp
  • 自定义组件名称AccountingPage
  • 代码文件BillInterface.etsAccountingPage.etsIndex.ets

四、代码实现

1. 定义账单接口
// 文件名:BillInterface.ets

export interface Bill {
   
  name: string; // 账单名称
  amount: number; // 账单金额
}
AI 代码解读

2. 模拟记账页面代码
// 文件名:AccountingPage.ets

import {
    Bill } from './BillInterface';

@Component
export struct AccountingPage {
   
  @State billName: string = ''; // 当前账单名称
  @State billAmount: number | null = null; // 当前账单金额
  @State bills: Bill[] = []; // 账单列表
  @State totalAmount: number = 0; // 总金额

  // 添加账单
  addBill(): void {
   
    if (this.billName && this.billAmount !== null && this.billAmount > 0) {
   
      this.bills.push({
    name: this.billName, amount: this.billAmount });
      this.updateTotalAmount();
      this.clearInput();
    }
  }

  // 删除账单
  removeBill(index: number): void {
   
    this.bills.splice(index, 1);
    this.updateTotalAmount();
  }

  // 更新总金额
  updateTotalAmount(): void {
   
    this.totalAmount = this.bills.reduce((sum, bill) => sum + bill.amount, 0);
  }

  // 清空输入框
  clearInput(): void {
   
    this.billName = '';
    this.billAmount = null;
  }

  build(): void {
   
    Column({
    space: 20 }) {
   
      Text('模拟记账应用')
        .fontSize(24)
        .fontWeight(FontWeight.Bold)
        .alignSelf(ItemAlign.Center);

      // 输入账单
      Row({
    space: 10 }) {
   
        TextInput({
   
          placeholder: '账单名称',
          text: this.billName
        })
          .width(200)
          .onChange((value: string) => (this.billName = value));

        TextInput({
   
          placeholder: '账单金额',
          text: this.billAmount?.toString() || ''
        })
          .width(150)
          .type(InputType.Number)
          .onChange((value: string) => (this.billAmount = parseFloat(value)));

        Button('添加')
          .onClick(() => this.addBill())
          .width(80)
          .height(40);
      }
      .alignSelf(ItemAlign.Center);

      // 账单列表
      Text('账单列表')
        .fontSize(20)
        .margin({
    top: 20 });

      List({
    space: 10 }) {
   
        ForEach(this.bills, (bill: Bill, index: number) => {
   
          ListItem() {
   
            Row({
    space: 10 }) {
   
              Text(`${
     bill.name} - ¥${
     bill.amount}`)
                .fontSize(18);
              Button('删除')
                .onClick(() => this.removeBill(index))
                .width(80);
            }
          }
        });
      }
      .width('100%');

      // 显示总金额
      Text(`总金额: ¥${
     this.totalAmount}`)
        .fontSize(20)
        .margin({
    top: 20 })
      Image($r('app.media.cat')) // 添加一张图片
        .width(305)
        .height(360);
    }
    .padding(20)
    .width('100%')
    .height('100%');
  }
}
AI 代码解读

3. 主入口文件
// 文件名:Index.ets

import {
    AccountingPage } from './AccountingPage';

@Entry
@Component
struct Index {
   
  build() {
   
    Column() {
   
      AccountingPage() // 调用记账页面
    }
    .padding(20);
  }
}
AI 代码解读

效果示例:通过输入账单名称与金额,并添加到列表中,实时查看账单总金额。

效果展示

20250101_212803.gif


五、代码解读

  1. 接口定义

    • 使用 Bill 接口统一账单数据结构,包含 nameamount 属性,确保账单管理的类型安全性。
  2. 账单输入与校验

    • 使用 TextInput 获取账单名称与金额,校验金额是否有效(大于零)。
  3. 动态列表展示

    • 使用 ListListItem 动态展示账单内容,支持实时添加与移除。
  4. 实时总金额统计

    • 使用 reduce 函数统计账单总金额,并在界面实时更新展示。
  5. 图片装饰

    • 添加 Image 组件作为装饰,提升界面的趣味性。

六、优化建议

  1. 增加账单分类功能,支持按类别查看账单记录。
  2. 实现总金额折扣计算,增强功能实用性。
  3. 提供数据导出功能,便于账单记录保存。

七、效果展示

  • 账单输入与展示:实时操作账单内容,界面动态更新。
  • 总金额统计:账单金额实时统计并显示在界面顶部。
  • 界面装饰:图片增强视觉吸引力。

八、相关知识点


小结

通过本篇教程,学习了如何使用接口定义账单结构,并结合鸿蒙组件实现动态记账功能。用户可以掌握列表操作、实时统计与界面装饰等开发技巧。


下一篇预告

在下一篇「UI互动应用篇29 - 模拟火车票查询系统」中,将实现一个模拟火车票查询系统,通过条件筛选展示符合条件的车次信息。


上一篇: 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏

下一篇: 「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=659
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


目录
打赏
0
67
68
1
151
分享
相关文章
|
3天前
|
HarmonyOS NEXT - Stage模型和应用/组件级配置
HarmonyOS 的 Stage 模型从 API 9 开始引入,是当前主推的应用模型。它通过 AbilityStage 和 WindowStage 等类为应用组件和窗口提供“舞台”。UIAbility 是包含用户界面的应用组件,用于与用户交互。 配置文件中,`AppScope/app.json5` 定义应用级图标和标签,而 `module.json5` 配置入口图标和标签。若配置了入口图标和标签,则会覆盖应用图标和标签,且未配置入口图标和标签会导致报错。JSON5 文件还定义了模块类型、设备支持、页面及能力(如 EntryAbility 和扩展能力 EntryBackupAbility)。
52 10
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
194 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
25 11
【01】优雅草星云物联网AI智控系统从0开发鸿蒙端适配完成流程-初始化鸿蒙编译器deveco studio项目结构-UI设计图切片下载-优雅草卓伊凡
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
64 27
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
62 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
HarmonyOS ArkTS声明式UI开发实战教程
本文深入探讨了ArkTS作为HarmonyOS生态中新一代声明式UI开发框架的优势与应用。首先对比了声明式与命令式开发的区别,展示了ArkTS如何通过直观高效的代码提升可维护性。接着分析了其核心三要素:数据驱动、组件化和状态管理,并通过具体案例解析布局体系、交互组件开发技巧及复杂状态管理方案。最后,通过构建完整TODO应用实战,结合调试优化指南,帮助开发者掌握声明式UI设计精髓,感受ArkTS的独特魅力。文章鼓励读者通过“破坏性实验”建立声明式编程思维,共同推动HarmonyOS生态发展。
68 3
HarmonyOS NEXT 实战系列07-应用状态
AppStorage 是应用全局的 UI 状态存储,支持跨 Ability 数据共享,提供 `setOrCreate` 和 `get` 方法管理全局状态,并通过 `@StorageProp` 和 `@StorageLink` 实现单向或双向数据同步至组件。PersistentStorage 基于 AppStorage,提供状态变量的持久化能力,可将选定属性保存到设备磁盘,但写操作同步执行,建议持久化数据小于 2KB,以避免影响 UI 渲染性能。相关持久化文件位于 `/data/app/el2/.../persistent_storage` 目录下。
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
UI-TARS Desktop 是一款基于视觉语言模型的 GUI 代理应用,支持通过自然语言控制电脑操作,提供跨平台支持、实时反馈和精准的鼠标键盘控制。
1497 17
用自然语言控制电脑,字节跳动开源 UI-TARS 的桌面版应用!内附详细的安装和配置教程
解锁鸿蒙装饰器:应用、原理与优势全解析
ArkTS提供了多维度的状态管理机制。在UI开发框架中,与UI相关联的数据可以在组件内使用,也可以在不同组件层级间传递,比如父子组件之间、爷孙组件之间,还可以在应用全局范围内传递或跨设备传递。
54 2
Harmony os next~UI开发与ArkUI框架
鸿蒙OS的UI开发基于ArkUI框架,采用声明式编程,简化开发流程。五大核心组件(Text、Button、List、Grid、Flex)助力高效布局,支持数据绑定与动态更新。事件响应机制灵敏,适合构建交互丰富的应用。实战技巧包括规范命名、样式复用和调试方法。掌握这些,轻松开发鸿蒙应用。下期预告:分布式开发,记得带上烤冷面!
43 0

物联网

+关注