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

news2025/1/8 0:17:17

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

在这里插入图片描述


关键词
  • 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; // 账单金额
}

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%');
  }
}

3. 主入口文件
// 文件名: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. 提供数据导出功能,便于账单记录保存。

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

八、相关知识点
  • 「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
來源:坚果派
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2272278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法,可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中,后台数据返回格式和指定合并是动态且没有规律的,Element 的示例过于简单&…

Uniapp Android 本地离线打包(详细流程)

一、简介 App 离线 SDK 暂时不支持 Kotlin,未来不清楚。 uniapp 提供了 云打包 与 本地打包 两种方案,云打包 需要排队且还有次数限制,本地打包 则就没有这些限制,而且会 本地打包 对开发 原生插件 有很大的帮助。 细节&#x…

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

Gitee图形界面上传(详细步骤)

目录 1.软件安装 2.安装顺序 3.创建仓库 4.克隆远程仓库到本地电脑 提交代码的三板斧 1.软件安装 Git - Downloads (git-scm.com) Download – TortoiseGit – Windows Shell Interface to Git 2.安装顺序 1. 首先安装git-2.33.1-64-bit.exe,顺序不能搞错2. …

WPF区域导航+导航参数使用+路由守卫+导航日志

背景:使用ContentControl控件实现区域导航是有Mvvm框架的WPF都能使用的,不限于Prism 主要是将ContenControl控件的Content内容在ViewModel中切换成不同的用户控件 下面是MainViewModel: private object body;public object Body {get { retu…

DeepSeek v3为何爆火?如何用其集成Milvus搭建RAG?

最近,DeepSeek v3(一个MoE模型,拥有671B参数,其中37B参数被激活)模型全球爆火。 作为一款能与Claude 3.5 Sonnet,GPT-4o等模型匹敌的开源模型DeepSeek v3不仅将其算法开源,还放出一份扎实的技术…

得物基于AIGC生成测试用例的探索与实践

一、背景 随着人工智能技术的快速发展,尤其是在自然语言处理(NLP)、计算机视觉和生成对抗网络(GANs)等领域,AIGC(AI Generated Content)得到了广泛应用,这一技术的进步使…

HTML5实现好看的二十四节气网页源码

HTML5实现好看的新年春节元旦网站源码 前言一、设计来源1.1 主界面1.2 关于我们界面1.3 春季节气界面1.4 夏季节气界面1.5 秋季节气界面1.6 冬季节气界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看的二十四节气网页源码,春季节气&#xf…

Hadoop集群之间实现免密登录

实现虚拟机之间能够互相登录,比如可以在hadoop1上面登录hadoop2。 第一步:执行”ssh-keygen -t rsa”命令,生成该虚拟机的密钥 第二步:密钥文件存储在/root/.ssh目录,执行cd /root/.ssh命令进入存储密钥文件的目录&am…

国产编辑器EverEdit - 常用资源汇总

1 国产编辑器EverEdit-常用资源汇总 EverEdit是一款国产文本编辑器,历经超过15年的更新和维护,拥有不输业界顶级商业文本编辑器(EmEditor、UltraEdit)的实力,甚至在某些方面的功能更强(当然,各有千秋),开发者对文本编辑…

C# 枚举格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 可以使用 Enum.ToString 方法,新建表示枚举成员的数字值、十六进制值或字符串值的字符串对象。枚举格式说明符不区分大小写。 二、自定义数字格式说明符详解…

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍

Microi吾码|开源低代码.NET、VUE低代码项目,表单引擎介绍 一、摘要二、Microi吾码介绍2.1 功能介绍2.2 团队介绍2.3 上线项目案例 三、Microi吾码表单引擎是什么?四、Microi吾码表单引擎功能4.1 模块引擎 - 由表单引擎驱动4.2 流程引擎 - 由表…

自动化立体库安全使用管理制度完整版

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。欢迎大家到本文底部评论区留言。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料,请球友到知识星球【智能仓储物流技术研习社】自行下载。 以下是《…

ArcGIS中怎么把数据提取到指定范围(裁剪、掩膜提取)

最近,经常能收到怎么把数据提取到指定范围、栅格数据怎么裁剪、矢量数据怎么裁剪、栅格数据怎么掩膜提取的咨询。 下面是我对这个问题的解决思路: 对于矢量数据: ①首先把数据加载进来 ②软件界面上面的工具栏找到→地理处理→裁剪&#x…

stm32的掉电检测机制——PVD

有时在一些应用中,我们需要检测系统是否掉电了,或者要在掉电的瞬间需要做一些处理。 STM32内部自带PVD功能,用于对MCU供电电压VDD进行监控。 STM32就有这样的掉电检测机制——PVD(Programmable Voltage Detecter),即可编程电压检…

QT:控件属性及常用控件(2)-----按钮类控件及显示类控件

文章目录 QT关于qrc一个蛋疼的问题一、按钮类控件1.PushButton1.1 给按钮加图标1.2 给按钮加快捷键 2.RadioButtion2.1 单选题2.2 关于状态2.3 多组单选 3.Check Box4.Tool Button 二、显示类控件1.Lable1.1 文本、图片显示1.2 Label格式1.3 设置伙伴(绑定伙伴关系) 2.LCDNumbe…

逆向入门(2)C篇-基础知识

C基础 1、在C中,函数的变量是从右往左传递的,也就是test(x,y),先传入y,再传x。 2、变量的分类: (1)全局变量。在编译的时候就已经确定了内存地址和宽度,变量名就是内存地址的别名…

【C语言】_assert断言

目录 1. assert功能 2. 使用assert判指针有效性 3. assert的参数 4. NDEBUG宏与assert机制的关闭 5. Debug版本与Release版本 1. assert功能 assert ( ) 是assert.h头文件定义的宏,用于在运行时确保程序符合指定条件: 如果不符合(条件…

在Unity中用Ab包加载资源(简单好抄)

第一步创建一个Editor文件夹 第二步编写BuildAb(这个脚本一点要放在Editor中因为这是一个编辑器脚本,放在其他地方可能会报错) using System.IO; using UnityEditor; using UnityEngine;public class BuildAb : MonoBehaviour {// 在Unity编…