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

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


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

一、功能说明

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

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

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

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

四、代码实现
1. 定义账单接口
typescript 复制代码
// 文件名:BillInterface.ets

export interface Bill {
  name: string; // 账单名称
  amount: number; // 账单金额
}

2. 模拟记账页面代码
typescript 复制代码
// 文件名: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%');
  }
}

3. 主入口文件
typescript 复制代码
// 文件名:Index.ets

import { AccountingPage } from './AccountingPage';

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

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

效果展示


五、代码解读
  1. 接口定义

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

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

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

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

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

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

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

八、相关知识点

小结

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


下一篇预告

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


上一篇: 「Mac畅玩鸿蒙与硬件50」UI互动应用篇27 - 水果掉落小游戏
下一篇: [「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统](#下一篇: 「Mac畅玩鸿蒙与硬件52」UI互动应用篇29 - 模拟火车票查询系统)

作者:SoraLuna

链接:https://www.nutpi.net/thread?topicId=659

來源:坚果派

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


相关推荐
轻口味1 小时前
【每日学点鸿蒙知识】低功耗蓝牙、指纹识别认证、读取raw文件示例、CommonEvent是否跨线程、定位参数解释等
华为·harmonyos
御承扬1 小时前
从零开始开发纯血鸿蒙应用之实现内部文件处理页
华为·harmonyos·arkts·文本编辑·文本浏览
轻口味1 小时前
【每日学点鸿蒙知识】ASON工具、自定义tabbar、musl、Text异常截断等
华为·harmonyos
liuhaikang2 小时前
鸿蒙MPChart图表自定义(六)在图表中绘制游标
华为·harmonyos
Haven.Liu8 小时前
MAC录屏QuikTimePlayer工具录屏声音小免费解决方案
macos
Septillions12 小时前
Mac 版本向日葵退出登录账号
macos·向日葵
tanghongchang12312 小时前
Mac Android Studio 提升Mac的编译速度
android·macos·android studio
MR乔.12 小时前
mac无限刷新navicat试用时间
macos
万少12 小时前
鸿蒙元服务实战-笑笑五子棋(1)
前端·harmonyos
塞尔维亚大汉13 小时前
【OpenHarmony】 鸿蒙网络请求库之eventsource
网络协议·harmonyos