HarmonyOS学习 实验九:@State和@Prop装饰器的使用方法

HarmonyOS应用开发:父子组件状态管理实验报告

引言

在HarmonyOS应用开发领域,组件之间的状态管理是一个至关重要的概念。通过有效的状态管理,我们可以确保应用的数据流动清晰、可预测,从而提升应用的稳定性和可维护性。本次实验旨在探索HarmonyOS中父子组件之间的状态管理机制,特别是通过@State@Prop装饰器实现状态传递的方法。

实验目的

本次实验的主要目的是在HarmonyOS应用中实现父子组件的状态管理,具体目标包括:

  • 掌握@State装饰器的使用方法,用于在组件内部定义和管理状态。
  • 理解@Prop装饰器的作用,实现父组件向子组件的状态传递。
  • 验证单向数据流的状态管理机制,确保子组件不能直接修改父组件的状态。

实验环境与技术栈

  • 开发软件:DevEco Studio(HarmonyOS官方推荐的集成开发环境)
  • 操作系统:HarmonyOS(实验在HarmonyOS设备上运行)
  • API版本:API9(确保兼容性和最新特性支持)
  • 编程语言与框架:ets(Extensible TypeScript),ArkUI框架(HarmonyOS的声明式UI开发框架)

实验步骤与代码实现

1. 创建父组件(ParentComponent.ets)

父组件是状态管理的核心,它负责定义和更新状态,并将状态传递给子组件。以下是父组件的关键代码实现:

// ParentComponent.ets
import {ChildComponent} from './ChildComponent';
@Entry
@Component
struct ParentComponent {// 父组件的状态变量,用于控制子组件的状态@State count: number = 0;build() {Column() {Text(`父组件计数: ${this.count}`).fontSize(20).margin({ top: 20 })// 增加计数按钮Button("增加计数").margin({ top: 10 }).onClick(() => {this.count++;})// 减少计数按钮Button("减少计数").margin({ top: 10 }).onClick(() => {this.count = Math.max(0, this.count - 1);})// 创建子组件,并将父组件的状态传递给子组件ChildComponent({ count: this.count })}.width("100%").height("100%")}
}

2. 创建子组件(ChildComponent.ets)

子组件负责接收并展示父组件传递的状态,但不能直接修改父组件的状态。以下是子组件的关键代码实现:

// ChildComponent.ets
export {ChildComponent}
@Entry
@Component
struct ChildComponent {// 使用@Prop装饰器接收父组件传递的状态@Prop count: number;build() {Column() {Text(`子组件接收到的计数: ${this.count}`).fontSize(18).margin({ top: 20 })// 子组件内部按钮,尝试修改父组件的状态(但不会生效,因为@Prop是单向绑定)Button("尝试修改父组件计数(无效)").margin({ top: 10 }).onClick(() => {this.count = 100; // 这里修改不会影响父组件})}.width("100%").height("100%")}
}

3.效果

在这里插入图片描述

在这里插入图片描述

遇到的问题及解决方案

在实验过程中,我们遇到了一个问题:在子组件中尝试修改父组件的状态时,发现修改无效。经过查阅文档和资料,我们理解到@Prop装饰器是单向绑定的,子组件不能直接修改父组件的状态。如果需要修改父组件的状态,应该通过事件回调的方式通知父组件进行修改。

实验结论与展望

通过本次实验,我们成功实现了HarmonyOS应用中父子组件的状态管理,验证了@State@Prop装饰器的使用方法,并深刻理解了单向数据流的状态管理机制。这些知识为后续更复杂的应用开发奠定了坚实的基础。

展望未来,我们将进一步探索HarmonyOS中的其他状态管理方案,如使用@Link装饰器实现双向绑定,以及利用状态管理库(如Redux)进行更复杂的状态管理。同时,我们也将关注HarmonyOS生态的不断发展和完善,期待更多高效、便捷的状态管理工具和方法的出现。


通过本次实验,我们不仅掌握了HarmonyOS中父子组件状态管理的基本方法,还深刻理解了单向数据流的重要性。希望这篇博客能够为HarmonyOS开发者提供一些有益的参考和借鉴。

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

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

相关文章

12.第二阶段x64游戏实战-远程调试

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:11.第二阶段x64游戏实战-框架代码细节优化 本次写的内容是关于调试、排错相关的…

c++基础三

1.继承 继承表示,子类可以获取父类的属性和方法,然后可以写子类独有的属性和方法,或者修改父类的方法。类可以继承父类的公共成员(public),但不能继承私有成员(private),私有成员只能在父类内部访问。 1.1 案例一单继承 #include <iostream>using namespace …

JSON学习笔记

文章目录 1. JSON是什么2. JSON的特点与结构3. JSON的使用4. JSON文件读取 1. JSON是什么 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript对象表示法&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和…

王牌学院,25西电通信工程学院(考研录取情况)

1、通信工程学院各个方向 2、通信工程学院近三年复试分数线对比 学长、学姐分析 由表可看出&#xff1a; 1、信息与通信工程25年相较于24年上升5分、军队指挥学25年相较于24年上升30分 2、新一代电子信息技术&#xff08;专硕&#xff09;25年相较于24年下降25分、通信工程&…

WPF依赖注入IHostApplicationLifetime关闭程序

WPF依赖注入IHostApplicationLifetime关闭程序 使用Application.Current.Shutdown();退出会报异常 应该使用 app.Dispatcher.InvokeShutdown(); Application.Current.Shutdown();app.Dispatcher.InvokeShutdown();static App app new();[STAThread]public static void Main(…

Jenkins 代理自动化-dotnet程序

两种方式 容器部署 本地部署 容器部署 可自动实现&#xff0c;服务器重启&#xff0c;容器自动运行 主要将dockerfile 写好 本地部署 1.服务器重启自动运行代理 参考下面的链接&#xff0c;只是把程序换成 java程序&#xff0c;提前确认好需要的jdk版本 Ubuntu20.04 设置开机…

从Archery到NineData:积加科技驱动数据库研发效能与数据安全双升级

积加科技作为国内领先的企业级数字化解决方案服务商&#xff0c;依托自研的 A4X 数字化平台&#xff08;https://a4x.io/&#xff09;&#xff0c;专注于为全球范围内的视觉物联网&#xff08;IoT&#xff09;设备提供 PaaS/SaaS 服务。致力于运用 AI 技术赋能物联网世界的各类…

SpringBoot整合Logback日志框架深度实践

一、依赖与默认集成机制 SpringBoot从2.x版本开始默认集成Logback日志框架,无需手动添加额外依赖。当项目引入spring-boot-starter-web时,该组件已包含spring-boot-starter-logging,其底层实现基于Logback+SLF4J组合。这种设计使得开发者只需关注业务日志的输出规则,无需处…

自由学习记录(56)

从贴图空间&#xff08;texture space&#xff09;将值还原到切线空间&#xff08;tangent space&#xff09;向量 tangentNormal.xy (packedNormal.xy * 2 - 1) * _BumpScale; 背后的知识点&#xff1a;法线贴图中的 RGB 是在 0~1 范围内编码的向量 所以贴图法线是怎么“压…

【mysql】mysql疑难问题:实际场景解释什么是排它锁 当前读 快照读

注&#xff1a; 理解本文 前置需要掌握的基础知识&#xff1a;事务隔离、锁的概念、并发知识&#xff1b; 事务隔离 尤其是事务延伸问题 是个重难点&#xff0c;绝非八股文那几句话就能说完的&#xff0c;在实际场景中&#xff0c;分析起来有一定难度 author: csdn博主 孟秋与你…

Python:使用web框架Flask搭建网站

Date: 2025.04.19 20:30:43 author: lijianzhan Flask 是一个轻量级的 Python Web 开发框架&#xff0c;以简洁灵活著称&#xff0c;适合快速构建中小型 Web 应用或 API 服务。以下是 Flask 的核心概念、使用方法和实践指南 Flask 的核心特点&#xff1a; 轻量级 核心代码仅约…

层次式架构核心:中间层的功能、优势与技术选型全解析

层次式架构中的中间层是整个架构的核心枢纽&#xff0c;承担着多种重要职责&#xff0c;在功能实现、优势体现以及技术选型等方面都有丰富的内容&#xff0c;以下为你详细介绍&#xff1a; 一、功能 1.业务逻辑处理 复杂规则运算&#xff1a;在许多企业级应用中&#xff0c;…

网络--应用层自定义协议与序列化

目录 4-1 应用层 4-2 重新理解 read、write、recv、send 和 tcp 为什么支持全双工 4-3 开始实现 4-1 应用层 我们程序员写的一个个解决我们实际问题 , 满足我们日常需求的网络程序 , 都是在应用 层 . 再谈 " 协议 " 协议是一种 " 约定 ". socke…

fastlio用mid360录制的bag包离线建图,提示消息类型错误

我用mid360录制的bag包&#xff0c;激光雷达的数据类型是sensor_msgs::PointCloud2&#xff0c;但是运行fast_lio中的mid360 launch文件&#xff0c;会报错&#xff08;没截图&#xff09;&#xff0c;显示无法从livox_ros_driver2::CustomMsg转换到sensor_msgs::PointCloud2。…

C# WinForm窗口TextBox控件只能输入数字(包括小数)并且恢复Ctrl+C复制和Ctrl+V粘贴功能

1. 前言 最近在写定GPS定位时&#xff0c;经纬度是用的double类型&#xff0c;并且经纬度的要求是小数点后最少6位&#xff0c;多了能达到17位&#xff0c;又遇到了常用的TextBox控件只能输入数字、小数的功能&#xff0c;因为有一年多没有写程序&#xff0c;现在再来写这些感…

【MySQL数据库】数据类型

目录 1&#xff0c;数据类型分类 2&#xff0c;bit类型 3&#xff0c;小数类型 3-1&#xff0c;float/double类型 3-2&#xff0c;decimal类型 4&#xff0c;字符串类型 4-1&#xff0c;char 4-2&#xff0c;varchar 5&#xff0c;日期和时间类型 6&#xff0c;enum和…

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…

pandas库详解

CONTENT 基本数据结构SeriesDataFrame 数据读取与写入读取 CSV 文件写入 CSV 文件 数据清洗处理缺失值数据类型转换 数据操作索引与切片数据合并数据分组与聚合 数据可视化 基本数据结构 Series Series 属于一维标记数组&#xff0c;由一组数据和对应的索引构成。 import pa…

黑马商城(五)微服务保护和分布式事务

一、雪崩问题 二、雪崩-解决方案&#xff08;服务保护方案&#xff09; 请求限流&#xff1a; 线程隔离&#xff1a; 服务熔断&#xff1a; 服务保护组件&#xff1a; 三、Sentinel 引入依赖&#xff1a; <!--sentinel--> <dependency><groupId>com.aliba…

洛谷P1312 [NOIP 2011 提高组] Mayan 游戏

题目 #算法/进阶搜索 思路: 根据题意,我们可以知道,这题只能枚举,剪枝,因此,我们考虑如何枚举,剪枝. 首先,我们要定义下降函数down(),使得小木块右移时,能够下降到最低处,其次,我们还需要写出判断函数,判断矩阵内是否有小木块没被消除.另外,我们还需要消除函数,将矩阵内三个相连…