鸿蒙OS开发实例:【工具类封装-emitter组件间通信】
1.鸿蒙开发TypeScript语言:【基础语法】2.鸿蒙开发TypeScript语言:【基础类型】3.鸿蒙开发TypeScript语言:【变量声明】4.鸿蒙开发TypeScript语言:【运算符】5.鸿蒙开发TypeScript语言:【条件语句】6.鸿蒙开发TypeScript语言:【循环】7.鸿蒙开发TypeScript语言:【函数】8.鸿蒙开发TypeScript语言:【Number】9.HarmonyOS开发实例:【相机和媒体库】10.鸿蒙开发实战:【系统服务框架部件】11.鸿蒙开发实战:【文件管理】12.鸿蒙开发实战:【系统服务管理部件】13.鸿蒙开发实战:【Hdf Framework】14.鸿蒙实战开发:【国际化部件】15.鸿蒙开发实例【使用高德地图鸿蒙SDK】(一)16.鸿蒙NXET实战:高德地图定位SDK【获取Key+获取定位数据】(二)17.鸿蒙开发案例:【图像加载缓存库ImageKnife】18.鸿蒙开发图形图像:【图形子系统】19.鸿蒙OpenHarmony开发实战:【MiniCanvas】20.鸿蒙ArkUI【开发移植Carbon】21.鸿蒙开发学习【地图位置服务组件】22.鸿蒙开发实战:网络请求库【axios】23.鸿蒙网络开发学习:【ylong_http】24.鸿蒙开发学习:【华为支付服务客户端案例】25.鸿蒙实战开发:【7日天气预报】26.鸿蒙开发实战:基于【Markwon】移植和开发27.鸿蒙OpenHarmony技术:【设备互信认证】28.鸿蒙OpenHarmony技术:【应用子系统/Launcher】29.鸿蒙开发实战:快速上手【万能卡片】30.鸿蒙APP开发实战:【Api9】拍照、拍视频;选择图片、视频、文件工具类31.鸿蒙OS应用开发:【DevEco Studio3.0 和 3.1版本差异】32.鸿蒙OS实战:【module的使用】33.鸿蒙OS应用示例:【数字滚动计时】34.鸿蒙OS封装【axios 网络请求】(类似Android的Okhttp3)35.鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比36.鸿蒙OS开发实例:【demo选择列表限定数量】37.鸿蒙开发实例:【demo-搜索历史记录】38.鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比(2)39.鸿蒙OS实例:同步获取应用配置的【versionCode和versionName】40.鸿蒙OS(ArkTS) 案例:【使用http网络请求框架加载验证码】41.鸿蒙OS开发案例:【API9】遍历沙漏文件夹并输入文件的大小42.鸿蒙OS开发问题:(ArkTS)【 RSA加解密,解决中文乱码等现象】43.鸿蒙OS开发问题:(ArkTS) 【解决中文乱码 string2Uint8Array、uint8Array2String】
44.鸿蒙OS开发实例:【工具类封装-emitter组件间通信】
45.鸿蒙OS开发实例:【工具类封装-http请求】46.鸿蒙OS开发实例:【工具类封装-首选项本地存储】47.鸿蒙OS开发实例:【工具类封装-页面路由】48.鸿蒙OS开发实例:【装饰器@Observed@ObjectLink】49.鸿蒙OS开发实例:【装饰器-@BuilderParam】50.鸿蒙OS开发实战:【悬浮窗口】51.鸿蒙OS开发实例:【页面传值跳转】52.鸿蒙OS开发实例:【Web网页】53.鸿蒙OS开发实例:【手撸服务卡片】54.鸿蒙OS开发实例:【应用级别文件浏览器】55.鸿蒙OS开发实例:【瀑布流式图片浏览】56.鸿蒙OS开发实例:【消息传递】57.鸿蒙OS开发实战:【打造自己的搜索入口】58.鸿蒙OS开发教学:【编程之重器-装饰器】59.鸿蒙OS开发实例:【窥探网络请求】60.鸿蒙OS开发实战:【Socket小试MQTT连接】61.鸿蒙OS开发实战:【穿戴应用】62.鸿蒙OS开发实例:【ArkTS 实现MQTT协议】63.鸿蒙OS开发实战:【网络管理HTTP数据请求】64.鸿蒙OS开发实例:【ArkTS类库多线程I/O密集型任务开发】65.鸿蒙OS开发实战:【ArkTS 实现MQTT协议(2)】66.鸿蒙OS开发实例:【通知消息】67.鸿蒙OS开发实例:【埋点探究】68.鸿蒙OS开发问题:【尺寸适配算法】69.鸿蒙OS开发实例:【NAPI入门】70.鸿蒙OS开发实例:【NAPI 进阶】71.鸿蒙OS开发案例:【ArkTS类库多线程CPU密集型任务Worker】72.鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】73.鸿蒙OS开发实例:【ArkTS类库多线程@Concurrent装饰器校验并发函数】74.鸿蒙OS元服务开发案例:【WebGL网页图形库开发着色器绘制彩色三角形】75.鸿蒙OS元服务开发说明:【WebGL网页图形库开发接口】76.鸿蒙OS开发实例:【ArkTS类库异步并发简述Promise】77.鸿蒙OS开发实例:【ArkTS类库异步并发async/await】78.鸿蒙原OS开发实例:【ArkTS类库单次I/O任务开发】79.鸿蒙OS元服务开发:【(Stage模型)学习窗口沉浸式能力】80.鸿蒙OS元服务开发:【(Stage模型)设置应用主窗口】81.鸿蒙OS元服务开发:【(Stage模型)设置悬浮窗】82.鸿蒙嵌入式南向开发案例:【智能养花机】83.鸿蒙OS开发实例:【应用状态变量共享】84.鸿蒙NEXT南向开发案例:【智能台灯】85.鸿蒙OS开发实例:【组件化模式】86.鸿蒙实战开发:【实现应用悬浮窗】87.鸿蒙南向开发实战:【智能窗帘】88.鸿蒙OS开发实例:【应用事件打点】89.鸿蒙南向开发实战:【智能扫地机】90.鸿蒙ArkUI实例:【自定义组件】91.鸿蒙ArkTS开始实例:【canvas实现签名板功能】92.鸿蒙OS开发实战:【自动化测试框架】使用指南93.鸿蒙ArkUI开发实战:制作一个【简单计数器】94.鸿蒙南向开发:制作【智能儿童手表】95.鸿蒙ArkUI声明式学习:【UI资源管理】96.鸿蒙OS实战开发:【多设备自适应服务卡片】97.OpenHarmony实例:【资源管理器】98.鸿蒙OS南向开发实战:【智能电子牌】99.鸿蒙ArkUI开发学习:【渲染控制语法】import Emitter from '@ohos.events.emitter';
import pasteboard from '@ohos.pasteboard';
MyEmitterUtil
是一个针对 HarmonyOS 的事件驱动编程封装类,主要用于组件间的通信和数据传递。
使用要求:
- DevEco Studio 3.1.1 Release 或更高版本
- API 版本:api 9 或更高
示例用法:
-
父组件绑定、解绑、向子组件发送事件:
aboutToAppear() { this.myEmitterUtil.onFather((eventData: EmitterData) => { console.info('父组件监听结果: ', JSON.stringify(eventData)); // 判断事件类型并执行相应操作... }); } aboutToDisappear() { this.myEmitterUtil.offFather(); } // 向子组件发送事件 this.myEmitterUtil.emitChild(MyEmitterUtil.UPDATE_DETAIL, "携带的测试数据");
-
子组件绑定、解绑、向父组件发送事件:
aboutToAppear() {
this.myEmitterUtil.onChild((eventData: EmitterData) => {
console.info('子组件监听结果: ', JSON.stringify(eventData));
// 判断事件类型并执行相应操作...
});
}
aboutToDisappear() {
this.myEmitterUtil.offChild();
}
// 向父组件发送事件
this.myEmitterUtil.emitFather(MyEmitterUtil.UPDATE_LIST, "测试");
this.myEmitterUtil.emitFather(MyEmitterUtil.UPDATE_LIST_2, "测试2");
参考文档:
请查阅 HarmonyOS 开发文档了解详细信息。
export class MyEmitterUtil {
private static readonly LOG_TAG = 'MyEmitterUtil';
private static EVENT_ID_COUNTER: number = 0; // 自动递增,生成唯一的事件ID
private readonly eventIdFather: number;
private readonly eventIdChild: number;
constructor() {
this.eventIdFather = MyEmitterUtil.EVENT_ID_COUNTER++;
this.eventIdChild = MyEmitterUtil.EVENT_ID_COUNTER++;
console.info(`事件ID(父组件): ${this.eventIdFather}`);
console.info(`事件ID(子组件): ${this.eventIdChild}`);
}
// 定义业务状态标识常量
static readonly UPDATE_LIST = "UPDATE_LIST";
static readonly UPDATE_LIST_2 = "UPDATE_LIST_2";
static readonly UPDATE_DETAIL = "UPDATE_DETAIL";
/**
* 在组件的`aboutToAppear`生命周期钩子中调用,监听父组件事件
* @param callback 事件回调函数,接受一个`EmitterData`对象作为参数
*/
onFather(callback: (eventData: EmitterData) => void) {
Emitter.on({ eventId: this.eventIdFather }, (event) => {
if (callback) {
callback(new EmitterData(event.data.flag, event.data.data));
}
});
}
/**
* 在组件的`aboutToDisappear`生命周期钩子中调用,解除父组件事件监听
*/
offFather() {
Emitter.off(this.eventIdFather);
}
/**
* 在组件的`aboutToAppear`生命周期钩子中调用,监听子组件事件
* @param callback 事件回调函数,接受一个`EmitterData`对象作为参数
*/
onChild(callback: (eventData: EmitterData) => void) {
Emitter.on({ eventId: this.eventIdChild }, (event) => {
if (callback) {
callback(new EmitterData(event.data.flag, event.data.data));
}
});
}
/**
* 在组件的`aboutToDisappear`生命周期钩子中调用,解除子组件事件监听
*/
offChild() {
Emitter.off(this.eventIdChild);
}
/**
* 向父组件发送事件
* @param flag 事件类型标识
* @param data 事件携带的数据
*/
emitFather(flag: string, data: string) {
Emitter.emit(
{ eventId: this.eventIdFather, priority: Emitter.EventPriority.IMMEDIATE },
{ data: { flag, data } }
);
}
/**
* 向子组件发送事件
* @param flag 事件类型标识
* @param data 事件携带的数据
*/
emitChild(flag: string, data: string) {
Emitter.emit(
{ eventId: this.eventIdChild, priority: Emitter.EventPriority.IMMEDIATE },
{ data: { flag, data } }
);
}
}
/**
* 用于封装事件数据的类
*/
export class EmitterData {
flag: string = "";
data: string = "";
constructor(flag: string, data: string) {
this.flag = flag;
this.data = data;
}
}
/**
* 获取剪贴板内容的辅助函数
*/
export async function getPasteboardContent(): Promise<void> {
try {
const systemPasteboard = pasteboard.getSystemPasteboard();
const pasteData = await systemPasteboard.getData();
const text = pasteData.getPrimaryText();
console.info('剪贴板内容: ', text);
} catch (e) {
console.error('获取剪贴板内容失败: ', JSON.stringify(e));
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!