HarmonyOS开发:传参方式

news2025/1/12 16:11:57

一、父子组件传参

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!";

    @Override
    protected void onInit() {
        super.onInit();
        // 使用框架提供的API发送数据
        sendData("receiverId", dataToSend);
    }

    // HarmonyUI框架的DataSender接口实现
    @Override
    public 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;

    @Override
    protected void onInit() {
        super.onInit();
        // 注册接收数据的回调
        HarmonyUI.getInstance().registerDataReceiver(this, "receiverId");
    }

    @Override
    public 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 {
    @Override
    protected 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.coloradmin.cn/o/2275555.html

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

相关文章

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化,两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的:乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于(…

深入解析 Flink 与 Spark 的性能差异

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理

哈喽~这里是维小帮,提供多个场所的定位管理方案,如需获取工厂人员定位管理系统解决方案可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中,我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装,用户管理,进程管理,shell 命令,硬链接和软连接,解压和压缩,功能性语句,结构性语句,分文件,make工具,shell脚本 0.2、C高级 …

L4-Prompt-Delta

Paper List PromptPapers:https://github.com/thunlp/PromptPapersDeltaPapers: https://github.com/thunlp/DeltaPapers Programming Toolkit OpemPrompt: https://github.com/thunlp/OpenPromptOpenDelta: https://github.com/thunlp/OpenDelta 一、传统微调方法&#xff1…

关于husky8.0 与 4.0的配置

husky的场景使用很多,一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认:git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…

ML汇总

Introduction and Overview 机器学习算法模型压缩Feature scaling 特征缩放损失函数正则化优化方式激活函数机器学习算法 逻辑回归: 用于二分类问题。它基于一个或多个预测变量建模二元结果的概率。 线性回归: 用于预测基于一个或多个预测变量的连续结果。它通过拟合线性方程来…

Day04-后端Web基础(Maven基础)

目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…

spring boot解决swagger中的v2/api-docs泄露漏洞

在配置文件中添加以下配置 #解决/v2/api-docs泄露漏洞 springfox:documentation:swagger-ui:enabled: falseauto-startup: false 处理前: 处理后:

【Linux】深入理解文件系统(超详细)

目录 一.磁盘 1-1 磁盘、服务器、机柜、机房 📌补充: 📌通常网络中用高低电平,磁盘中用磁化方向来表示。以下是具体说明: 📌如果有一块磁盘要进行销毁该怎么办? 1-2 磁盘存储结构 ​编辑…

CSS如何让一个盒子或内容在指定区域中上下左右居中

要使用CSS让盒子或内容在其父元素中上下左右居中,可以使用多种方法。例如:flexbox布局、使用grid布局、box布局、使用position定位和transform结合、以及表格属性等等,相关属性来实现内容的上下左右的居中。 接下来我们使用以上的方法&#x…

用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验,后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…

Qt学习笔记第81到90讲

第81讲 串口调试助手实现自动发送 为这个名叫“定时发送”的QCheckBox编写槽函数。 想要做出定时发送的效果,必须引入QT框架下的毫秒级定时器QTimer,查阅手册了解详情。 在widget.h内添加新的私有成员变量: QTimer *timer; 在widget类的构造…

hutool-http实现离线爬虫

文章目录 1.数据爬取流程2.离线爬虫(Hutool-http实现)1.获取数据2.数据清洗3.为什么有各种类型的强转4.数据入库 3.测试完整代码 1.数据爬取流程 1.分析数据源(怎么获取) 2.拿到数据后怎么处理 3.写入数据库存储 2.离线爬虫(Hutool-http实现) 1.获取数据 这里返回的是jso…

【C语言】_使用冒泡排序模拟实现qsort函数

目录 1. 排序函数的参数 2. 排序函数函数体 2.1 比较元素的表示 2.2 交换函数Swap的实现 2.3 排序函数bubble_sort的实现 3. 测试整型数据排序 3.1 整型数据比较函数cmp_int的实现 3.2 整型数据排序后输出函数print_int的实现 3.3 整型数据测试函数test_int的实现 3…

ECharts饼图下钻

背景 项目上需要对Echarts饼图进行功能定制,实现点击颜色块,下钻显示下一层级占比 说明 饼图实现点击下钻/面包屑返回的功能 实现 数据结构 [{name: a,value: 1,children: [...]},... ]点击下钻 // 为图表绑定点击事件(需要在destroy…

Java聊天小程序

拟设计一个基于 Java 技术的局域网在线聊天系统,实现客户端与服务器之间的实时通信。系统分为客户端和服务器端两类,客户端用于发送和接收消息,服务器端负责接收客户端请求并处理消息。客户端通过图形界面提供用户友好的操作界面,服务器端监听多个客户端的连接并管理消息通…

蓝桥杯嵌入式速通(1)

1.工程准备 创建一文件夹存放自己的代码,并在mdk中include上文件夹地址 把所有自身代码的头文件都放在headfile头文件中,之后只需要在新的文件中引用headfile即可 headfile中先提前可加入 #include "stdio.h" #include "string.h"…

net-http-transport 引发的句柄数(协程)泄漏问题

Reference 关于 Golang 中 http.Response.Body 未读取导致连接复用问题的一点研究https://manishrjain.com/must-close-golang-http-responsehttps://www.reddit.com/r/golang/comments/13fphyz/til_go_response_body_must_be_closed_even_if_you/?rdt35002https://medium.co…