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

打印 上一主题 下一主题

主题 1054|帖子 1054|积分 3166

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


关键词



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

一、功能说明

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

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

二、所需组件



  • @Entry 和 @Component 装饰器
  • TextInput 和 Button 组件完成账单输入与操作
  • List 和 ListItem 组件用于账单展示
  • Text 和 Image 组件用于展示账单内容、总金额及图片装饰
  • @State 修饰符用于状态管理

三、项目结构



  • 项目名称:AccountingApp
  • 自定义组件名称:AccountingPage
  • 代码文件:BillInterface.ets、AccountingPage.ets、Index.ets

四、代码实现

1. 定义账单接口

  1. // 文件名:BillInterface.ets
  2. export interface Bill {
  3.   name: string; // 账单名称
  4.   amount: number; // 账单金额
  5. }
复制代码

2. 模拟记账页面代码

  1. // 文件名:AccountingPage.ets
  2. import { Bill } from './BillInterface';
  3. @Component
  4. export struct AccountingPage {
  5.   @State billName: string = ''; // 当前账单名称
  6.   @State billAmount: number | null = null; // 当前账单金额
  7.   @State bills: Bill[] = []; // 账单列表
  8.   @State totalAmount: number = 0; // 总金额
  9.   // 添加账单
  10.   addBill(): void {
  11.     if (this.billName && this.billAmount !== null && this.billAmount > 0) {
  12.       this.bills.push({ name: this.billName, amount: this.billAmount });
  13.       this.updateTotalAmount();
  14.       this.clearInput();
  15.     }
  16.   }
  17.   // 删除账单
  18.   removeBill(index: number): void {
  19.     this.bills.splice(index, 1);
  20.     this.updateTotalAmount();
  21.   }
  22.   // 更新总金额
  23.   updateTotalAmount(): void {
  24.     this.totalAmount = this.bills.reduce((sum, bill) => sum + bill.amount, 0);
  25.   }
  26.   // 清空输入框
  27.   clearInput(): void {
  28.     this.billName = '';
  29.     this.billAmount = null;
  30.   }
  31.   build(): void {
  32.     Column({ space: 20 }) {
  33.       Text('模拟记账应用')
  34.         .fontSize(24)
  35.         .fontWeight(FontWeight.Bold)
  36.         .alignSelf(ItemAlign.Center);
  37.       // 输入账单
  38.       Row({ space: 10 }) {
  39.         TextInput({
  40.           placeholder: '账单名称',
  41.           text: this.billName
  42.         })
  43.           .width(200)
  44.           .onChange((value: string) => (this.billName = value));
  45.         TextInput({
  46.           placeholder: '账单金额',
  47.           text: this.billAmount?.toString() || ''
  48.         })
  49.           .width(150)
  50.           .type(InputType.Number)
  51.           .onChange((value: string) => (this.billAmount = parseFloat(value)));
  52.         Button('添加')
  53.           .onClick(() => this.addBill())
  54.           .width(80)
  55.           .height(40);
  56.       }
  57.       .alignSelf(ItemAlign.Center);
  58.       // 账单列表
  59.       Text('账单列表')
  60.         .fontSize(20)
  61.         .margin({ top: 20 });
  62.       List({ space: 10 }) {
  63.         ForEach(this.bills, (bill: Bill, index: number) => {
  64.           ListItem() {
  65.             Row({ space: 10 }) {
  66.               Text(`${bill.name} - ¥${bill.amount}`)
  67.                 .fontSize(18);
  68.               Button('删除')
  69.                 .onClick(() => this.removeBill(index))
  70.                 .width(80);
  71.             }
  72.           }
  73.         });
  74.       }
  75.       .width('100%');
  76.       // 显示总金额
  77.       Text(`总金额: ¥${this.totalAmount}`)
  78.         .fontSize(20)
  79.         .margin({ top: 20 })
  80.       Image($r('app.media.cat')) // 添加一张图片
  81.         .width(305)
  82.         .height(360);
  83.     }
  84.     .padding(20)
  85.     .width('100%')
  86.     .height('100%');
  87.   }
  88. }
复制代码

3. 主入口文件

  1. // 文件名:Index.ets
  2. import { AccountingPage } from './AccountingPage';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   build() {
  7.     Column() {
  8.       AccountingPage() // 调用记账页面
  9.     }
  10.     .padding(20);
  11.   }
  12. }
复制代码

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

  
五、代码解读


  • 接口定义

    • 使用 Bill 接口统一账单数据结构,包含 name 和 amount 属性,确保账单管理的范例安全性。

  • 账单输入与校验

    • 使用 TextInput 获取账单名称与金额,校验金额是否有用(大于零)。

  • 动态列表展示

    • 使用 List 和 ListItem 动态展示账单内容,支持实时添加与移除。

  • 实时总金额统计

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

  • 图片装饰

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


六、优化发起


  • 增长账单分类功能,支持按类别查看账单记载。
  • 实现总金额折扣盘算,增强功能实用性。
  • 提供数据导出功能,便于账单记载保存。

七、结果展示



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

八、相关知识点



  • 「Mac畅玩鸿蒙与硬件13」鸿蒙UI组件篇3 - TextInput组件获取用户输入
  • 「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表

小结

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

下一篇预告

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

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

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


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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表