HarmonyOS开发:传参方式

一、父子组件传参

1、父传子(@Prop方式)

父组件代码

@Entry
@Component
struct ParentComponent {@State parentMessage: string = 'Hello from Parent';build() {Column() {ChildComponent({ message: this.parentMessage });}}
}

子组件代码

@Component
struct ChildComponent {@Prop message: string;build() {Column() {Text(this.message);}}
}

2、父传子(@Link方式,实现双向绑定)

父组件代码

@Entry
@Component
struct ParentComponent {@State parentValue: number = 0;build() {Column() {ChildComponent({ value: $this.parentValue }); // 注意这里使用了$符号,表示传递的是引用Text('父组件的值: ' + this.parentValue);}}
}

子组件代码

@Component
struct ChildComponent {@Link value: number;build() {Column() {Text('子组件的值: ' + this.value);Button('Increase').onClick(() => {this.value += 1; // 修改子组件的值,父组件的值也会同步更新});}}
}

父组件ParentComponent通过@Link方式将parentValue的值传递给子组件ChildComponent,并实现了双向绑定。当子组件中的按钮被点击时,value的值会增加,同时父组件中的parentValue也会同步更新。

二、页面间的传参(使用router模板)

1、页面A代码

import { router } from '@ohos.router';@Entry
@Component
struct PageA {@State dataToSend: string = 'Data from Page A';build() {Column() {Button('Go to Page B').onClick(() => {router.pushUrl({url: 'pages/PageB',params: { message: this.dataToSend }});});}}
}

页面B代码

import { router } from '@ohos.router';@Entry
@Component
struct PageB {private receivedMessage: string = '';aboutToAppear() {const params = router.getParams();if (params && params.message) {this.receivedMessage = params.message;}}build() {Column() {Text('Received Message: ' + this.receivedMessage);}}
}

页面A通过router.pushUrl方法跳转到页面B,并在params参数中传递了dataToSend的值。页面B在aboutToAppear生命周期方法中通过router.getParams方法获取了这个值,并将其显示在页面上。

全局状态管理(使用装饰器)

// 定义全局状态管理器
@Observed
export class GlobalState {userLoggedIn: boolean = false;userName: string = "";
}// 组件A,用于修改全局状态
@Component
export struct ComponentA {@ObjectLink globalState: GlobalState;build() {Column() {Button("Login").onClick(() => {this.globalState.userLoggedIn = true;this.globalState.userName = "John Doe";});}}
}// 组件B,用于显示全局状态
@Component
export struct ComponentB {@Consume globalState: GlobalState;build() {Column() {if (this.globalState.userLoggedIn) {Text("User Logged In: " + this.globalState.userName);} else {Text("User Not Logged In");}}}
}

GlobalState 类被 @Observed 装饰器装饰,表示它是一个可观察的全局状态。ComponentA 和 ComponentB 分别使用 @ObjectLink 和 @Consume 装饰器来接收这个全局状态。当 ComponentA 修改全局状态时,ComponentB 会自动更新显示内容。

事件总线(Event Bus)

// 定义事件总线
const eventBus = new (function() {this.events = {};this.on = function(eventName, callback) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(callback);};this.emit = function(eventName, data) {if (this.events[eventName]) {this.events[eventName].forEach(function(callback) {callback(data);});}};
})();// 组件A,用于发送事件
@Component
export struct ComponentA {build() {Button("Send Event").onClick(() => {eventBus.emit("customEvent", { message: "Hello from ComponentA" });});}
}// 组件B,用于接收事件
@Component
export struct ComponentB {message: string = "";constructor() {eventBus.on("customEvent", (data) => {this.message = data.message;});}build() {Text(this.message);}
}

依赖注入(模拟)

// 数据服务组件的工厂类
class DataServiceFactory {static getDataService() {return new DataService();}
}// 数据服务组件
class DataService {getData() {return "Sample Data";}
}// 页面组件,使用依赖注入获取数据服务组件
@Component
export struct PageComponent {dataService: DataService;constructor() {this.dataService = DataServiceFactory.getDataService();}build() {Text(this.dataService.getData());}
}

创建了一个 DataServiceFactory 类来提供 DataService 的实例。在 PageComponent 中,我们通过调用 DataServiceFactory.getDataService() 方法来获取 DataService 的实例,并将其存储在 dataService 属性中。然后,我们在 build 方法中使用这个数据服务来获取数据并显示在页面上。

使用存储机制(用户首选项)

import dataPreferences from '@ohos.data.preferences';let context = getContext(this);
let preference: dataPreferences.Preferences;class PreferenceModel {async getPreferencesFromStorage(db_name: string) {try {preference = await dataPreferences.getPreferences(context, db_name);} catch (err) { }}async putData(key: string, data: string, db_name: string = "DB_NAME") {if (!preference) {await this.getPreferencesFromStorage(db_name);}try {await preference.put(key, data);} catch (err) { }await preference.flush();}async getData(key: string, db_name: string = "DB_NAME") {if (!preference) {await this.getPreferencesFromStorage(db_name);}return await preference.get(key, "");}
}const preferenceModel = new PreferenceModel();// 存储数据
preferenceModel.putData("name", "John Doe");// 读取数据
preferenceModel.getData("name").then((data) => {console.log("Name: " + data);
});

创建了一个 PreferenceModel 类来封装用户首选项的存储和读取操作。我们使用 getPreferencesFromStorage 方法来获取用户首选项的实例,并使用 putData 和 getData 方法来存储和读取数据。然后,我们使用这些方法来存储和读取名为 "name" 的数据。

通过服务进行通信(Service Ability)

// Service Ability 的实现
@Entry
@Service
export class MyService extends Ability {onConnect(intent: Intent): IRemoteObject {return new MyRemoteObject();}
}class MyRemoteObject extends RemoteObject implements IRemoteBroker {onRemoteRequest(code: number, data: MessageParcel, reply: MessageParcel, option: MessageOption): boolean {// 处理来自客户端的请求let message = data.readString();console.log("Received message from client: " + message);// 回复客户端reply.writeString("Hello from service!");return true;}
}// 客户端组件,用于连接和发送消息给 Service Ability
@Component
export struct ClientComponent {build() {Button("Send Message to Service").onClick(() => {let context = getContext() as UIAbilityContext;let intent = new Intent();intent.setElement(new ElementName("com.example.myapplication", "com.example.myapplication.MyService"));context.connectAbility(intent, (err, remoteObject) => {if (err) {console.error("Failed to connect to service: " + err.message);return;}let messageParcel = new MessageParcel();messageParcel.writeString("Hello from client!");remoteObject.sendRequest(1, messageParcel, (reply, option) => {let response = reply.readString();console.log("Received response from service: " + response);});});});}
}

创建了一个 MyService 类来定义 Service Ability。它实现了 onConnect 方法来返回一个 MyRemoteObject 实例,该实例用于处理来自客户端的请求。客户端组件 ClientComponent 使用 connectAbility 方法连接到 Service Ability,并使用 sendRequest 方法发送消息给服务。服务接收到消息后,处理消息并回复客户端。

使用第三方库或框架提供的传参机制案例

假设的第三方UI框架:HarmonyUI

1. 安装和配置第三方库

首先,确保你的项目已经配置了第三方UI框架 HarmonyUI。通常这需要在项目的 build.gradle 文件中添加依赖项。

dependencies {implementation 'com.example:harmonyui:1.0.0'
}

2. 创建两个组件:

SenderComponent 和 ReceiverComponent

SenderComponent.java
import com.example.harmonyui.Component;
import com.example.harmonyui.communication.DataSender;public class SenderComponent extends Component implements DataSender {private String dataToSend = "Hello, Receiver!";@Overrideprotected void onInit() {super.onInit();// 使用框架提供的API发送数据sendData("receiverId", dataToSend);}// HarmonyUI框架的DataSender接口实现@Overridepublic void sendData(String receiverId, String data) {// 调用框架提供的发送数据方法HarmonyUI.getInstance().sendData(receiverId, data);}
}
ReceiverComponent.java
import com.example.harmonyui.Component;
import com.example.harmonyui.communication.DataReceiver;public class ReceiverComponent extends Component implements DataReceiver {private String receivedData;@Overrideprotected void onInit() {super.onInit();// 注册接收数据的回调HarmonyUI.getInstance().registerDataReceiver(this, "receiverId");}@Overridepublic void onDataReceived(String data) {this.receivedData = data;// 更新UI或执行其他逻辑updateUI();}private void updateUI() {// 假设有一个显示数据的文本视图textView.setText(receivedData);}
}

3、在主应用中注册和使用这两个组件

MainApplication.java
import com.example.harmonyui.Application;
import com.example.harmonyui.layout.LinearLayout;public class MainApplication extends Application {@Overrideprotected void onCreate() {super.onCreate();// 创建布局LinearLayout layout = new LinearLayout();// 创建组件实例SenderComponent senderComponent = new SenderComponent();ReceiverComponent receiverComponent = new ReceiverComponent();// 将组件添加到布局中layout.addChild(senderComponent);layout.addChild(receiverComponent);// 设置主布局setMainLayout(layout);}
}

通过上述代码,SenderComponent 使用 HarmonyUI 框架提供的 sendData 方法将字符串数据发送给 ReceiverComponentReceiverComponent 通过实现 DataReceiver 接口并注册接收数据的回调来接收数据,并在接收到数据后更新UI。

码字不易,各位网友大佬点点赞呗

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

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

相关文章

软件23种设计模式完整版[附Java版示例代码]

一、什么是设计模式 设计模式是在软件设计中反复出现的问题的通用解决方案。它们是经过多次验证和应用的指导原则,旨在帮助软件开发人员解决特定类型的问题,提高代码的可维护性、可扩展性和重用性。 设计模式是一种抽象化的思维方式,可以帮助开发人员更好地组织和设计他们…

React+redux项目搭建流程

1.创建项目 create-react-app my-project --template typescript // 创建项目并使用typescript2.去除掉没用的文件夹,只保留部分有用的文件 3.项目配置: 配置项目的icon 配置项目的标题 配置项目的别名等(craco.config.ts&…

nginx-灰度发布策略(基于cookie)

一. 简述: 基于 Cookie 的灰度发布是一种常见的策略,它允许您根据用户的特定 Cookie 值将流量路由到不同的服务版本。这种方法可以确保只有满足条件的用户会看到新版本的功能,从而降低风险并便于监控和回滚。 二. 配置案例: 测…

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么? 了解后台任务和长时任务前,我们需要先明白鸿蒙的后台特性:所谓的后台,指的是设备返回主界面、锁屏、…

怎么用vs编python文件

用vs编写python文件的方法:1、安装python插件,在vs的Extensions扩展中搜索Python,如下: 2、安装完成后,就需要配置一下本地python解释器的路径,这个直接在settings.json文件中设置参数python.pythonPath就可…

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客:https://azureblog.cn/ 😊 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式(Singleton) 游戏实现中的唯一对象 在游戏开发过程中…

【工业场景】用YOLOv8实现工业安全帽识别

工业安全帽识别是一项重要的工作安全管理措施,旨在防止工作场所发生头部伤害事故。通过使用YOLOv8等深度学习模型,可以实时准确地检测出工人是否佩戴安全帽,及时发现违规行为,为工人提供更安全的工作环境。 使用YOLOv8实现工业安全…

路由器的转发表

【4-24】 已知路由器R₁ 的转发表如表T-4-24 所示。 表T-4-24 习题4-24中路由器R₁的转发表 前缀匹配 下一跳地址 路由器接口 140.5.12.64/26 180.15.2.5 m2 130.5.8/24 190.16.6.2 ml 110.71/16 ----- m0 180.15/16 ----- m2 190.16/16 ----- ml 默认 11…

打开idea开发软件停留在加载弹出框页面进不去

问题 idea软件点击打开,软件卡在加载弹框进不去。 解决方法 先进入“任务管理器”停止IDEA的任务进程 2.找到IDEA软件保存的本地数据文件夹 路径都是在C盘下面:路径:C:\Users\你的用户名\AppData\Local\JetBrains 删除目录下的文件夹&…

【网络安全 | 漏洞挖掘】HubSpot 全账户接管(万字详析)

未经许可,不得转载。 今天我们将分享一个关于在 Bugcrowd 平台的 HubSpot 公共漏洞赏金计划中实现全账户接管的故事。 文章目录 正文SQL 注入主机头污染(Host Header Poisoning)负载均衡器主机头覆盖(Load Balancer Host Header Override)Referer Header 测试ORIGIN Heade…

[笔记] Jenkins 安装与配置全攻略:Ubuntu 从零开始搭建持续集成环境

随着 DevOps 流程的普及,持续集成(CI)和持续交付(CD)已成为现代软件开发中不可或缺的一部分。Jenkins 作为一款开源的自动化服务器,广泛应用于 CI/CD 管道的构建与管理。它不仅支持多种编程语言和工具链&am…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…

Keepalived 进阶秘籍:全方位配置优化

文章目录 1.sysctl.conf参数优化2. limits参数优化3. global_defs模块区域4.vrrp_script模块区域5.vrrp_instance VI_1实例定义配置模块区域6. virtual_server模块区域7.Keepalived与Heartbeat、Corosync比较 前言: 作为一台Keepalived服务器,有必要对内…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…

rabbitmq——岁月云实战笔记

1 rabbitmq设计 生产者并不是直接将消息投递到queue,而是发送给exchange,由exchange根据type的规则来选定投递的queue,这样消息设计在生产者和消费者就实现解耦。 rabbitmq会给没有type预定义一些exchage,而实际我们却应该使用自己定义的。 1.1 用户注册设计 用户在…

基于Python的投资组合收益率与波动率的数据分析

基于Python的投资组合收益率与波动率的数据分析 摘要:該文通过研究马科维茨的投资组合模型,并将投资组合模型应用到包含6只金融股票的金融行业基金中。首先通过开源的财经接口Tushare获取股票原始数据,接着利用数据分析的黄金组合库&#xf…

Linux部署web项目【保姆级别详解,Ubuntu,mysql8.0,tomcat9,jdk8 附有图文】

文章目录 部署项目一.安装jdk1.1 官网下载jdk81.2 上传到Linux1.3 解压1.4 配置环境变量1.5 查看是jdk是否安装成功 二.安装TomCat2.1 官网下载2.2 上传到Linux2.3 解压2.4配置2.5 启动Tomcat2.6 验证是否成功 三.安装mysql四.部署javaweb项目4.1 打包4.2 启动tomcat 部署项目 …

前端基础--网络

http1到http2有哪些新增和区别 HTTP/1.0版本主要增加了 1,增加了HEAD,POST等方法 2,增加了状态码 3,增加了请求头和响应头 4,引入content-type,传输不在仅限于文本 5,在请求中加入了HTTP版本号 HTTP…

Maven 详细配置:Maven 项目 POM 文件解读

Maven 是 Java 开发领域中广泛使用的项目管理和构建工具,通过其核心配置文件——POM(Project Object Model)文件,开发者能够定义项目的基本信息、依赖关系、插件配置以及构建生命周期等关键要素。POM 文件不仅是 Maven 项目的核心…