From 76c5f5230a6a09a75865087d5e2fae60412c8f07 Mon Sep 17 00:00:00 2001 From: duke Date: Thu, 4 Sep 2025 19:33:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(library):=20=E6=B7=BB=E5=8A=A0=E5=AF=B9=20?= =?UTF-8?q?ViewModel=20=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 EventPost 类中添加 onFromViewModel 方法,用于在 ViewModel 中注册事件监听 - 在 EventPostExtensions 中实现 onFromViewModel 的默认方法 - 更新 CHANGELOG.md 和 README.md,添加对 ViewModel支持的说明 - 在 oh-package.json5 中添加 @duke/view-model 依赖 --- CHANGELOG.md | 4 +++ README.md | 35 ++++++++++++++++----- entry/oh-package-lock.json5 | 25 +++++++++++---- library/CHANGELOG.md | 4 +++ library/README.md | 34 +++++++++++++++----- library/oh-package.json5 | 5 +-- library/src/main/ets/EventPost.ts | 12 +++++++ library/src/main/ets/EventPostExtensions.ts | 23 +++++++++++++- 8 files changed, 118 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d34796e..a898e1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [v2.2.0] 2025.09.04 + +- 添加对ViewModel的支持 + ## [v2.1.2] 2025.09.02 - 修改Subscriber方法申明,帮助IDE寻找装饰器,提升使用者开发效率 diff --git a/README.md b/README.md index eea4d8f..0c7cf3f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # EventPost ## 简介 -[![openHarmony](https://img.shields.io/badge/openharmony-v2.1.2-brightgreen)](https://gitee.com/Duke_Bit/eventpost/releases/tag/v2.1.2) + +[![openHarmony](https://img.shields.io/badge/openharmony-v2.2.0-brightgreen)](https://gitee.com/Duke_Bit/eventpost/releases/tag/v2.2.0) EventPost是一款消息总线,具有生命周期感知能力,支持Sticky。 @@ -65,7 +66,18 @@ EventPost.getDefault().onFromComponent("msgId", this, (arg1:object, arg2:object) }) ``` -- 三种注册方式任性其一,onFromComponent 和装饰器均能感知组件生命周期 +在ViewModel中使用onFromViewModel + +```typescript +import { EventPost } from "eventpost"; + +EventPost.getDefault().onFromViewModel("msgId", this, (arg1:object, arg2:object) => { +}) +``` +ViewModel的使用请参考[ViewModel](https://gitee.com/Duke_Bit/view-model) +直接new不加装饰器的话,还是会有内存泄露的 + +- 四种注册方式任性其一,onFromComponent、onFromViewModel 和装饰器均能感知组件生命周期 - 使用on的方法注册的话,需要自行off防止内存泄漏 ### 发送消息 @@ -86,6 +98,7 @@ EventPost.getDefault().post("msgId", "arg1", { params1: "bbb" }) | setAllSticky | boolean | 配置基础消息发送是否为粘性事假,默认为粘性,跨线配置非粘性,则每个线程均要初始化 | | on | string,function,sticky,callThis | 注册订阅方法,并配置是否支持粘性 | | onFromComponent | string,component,function,sticky | 注册订阅方法,并配置是否支持粘性,仅支持组件内注册,能够自动反注册 | | +| onFromViewModel | string,ViewModel,function,sticky | 注册订阅方法,并配置是否支持粘性,仅支持ViewModel内注册,能够自动反注册 | | | off | string,function | 反注册订阅方法 | | once | string,function,callThis | 注册一次性订阅方法 | | post | string,...args:any[] | 发送消息(受配置影响) | @@ -112,7 +125,6 @@ DevEco Studio: 5.0.5.315, SDK: HarmonyOS 5.0.1 Release Ohos_sdk_public 5.0.1.115 |---- eventpost | |---- AppScrope # 示例代码文件夹 | |---- entry # 示例代码文件夹 -| |---- examples # 示例代码文件夹 | |---- library # eventpost库文件夹 | |---- build # eventpost模块打包后的文件 | |---- src/main/ets/eventpost # EventPost主入口 @@ -132,10 +144,17 @@ DevEco Studio: 5.0.5.315, SDK: HarmonyOS 5.0.1 Release Ohos_sdk_public 5.0.1.115 ## 其他库 -- [@duke/logan-ext](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan-ext) Logan扩展库,方便开箱即用: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) -- [@duke/logan](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan) Logan是一个为OpenHarmony开发的日志库,对美团技术团队的Logan的鸿蒙化移植版本: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) +- [@duke/view-model](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fview-model) + 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/view-model](https://gitee.com/Duke_Bit/view-model) +- [@duke/logan-ext](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan-ext) + Logan扩展库,方便开箱即用: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) +- [@duke/logan](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan) + Logan是一个为OpenHarmony开发的日志库,对美团技术团队的Logan的鸿蒙化移植版本: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) - [@duke/websocket-client](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fwebsocket-client) WebSocket库解决官方API的一些bug问题: [https://gitee.com/Duke_Bit/websocket](https://gitee.com/Duke_Bit/websocket) -- [@duke/component-lifecycle](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fcomponent-lifecycle) 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/component-lifecycle](https://gitee.com/Duke_Bit/component-lifecycle) -- [@duke/elf-dialog](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-dialog) CustomDialog黑魔法 不依赖promptAction 实现的函数级弹窗,省去复杂的模版代码,让你专注于你的业务,一行代码搞定弹窗: [https://gitee.com/Duke_Bit/elf-dialog](https://gitee.com/Duke_Bit/elf-dialog) -- [@duke/elf-refresh](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-refresh) OpenHarmony 刷新组件,支持下拉刷新和上拉加载更多,支持各种组件,List、Grid,支持header,footer,目标打造HarmonyOS的SmartRefreshLayout: [https://gitee.com/Duke_Bit/ElfRefresh](https://gitee.com/Duke_Bit/ElfRefresh) \ No newline at end of file +- [@duke/component-lifecycle](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fcomponent-lifecycle) + 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/component-lifecycle](https://gitee.com/Duke_Bit/component-lifecycle) +- [@duke/elf-dialog](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-dialog) CustomDialog黑魔法 不依赖promptAction + 实现的函数级弹窗,省去复杂的模版代码,让你专注于你的业务,一行代码搞定弹窗: [https://gitee.com/Duke_Bit/elf-dialog](https://gitee.com/Duke_Bit/elf-dialog) +- [@duke/elf-refresh](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-refresh) OpenHarmony + 刷新组件,支持下拉刷新和上拉加载更多,支持各种组件,List、Grid,支持header,footer,目标打造HarmonyOS的SmartRefreshLayout: [https://gitee.com/Duke_Bit/ElfRefresh](https://gitee.com/Duke_Bit/ElfRefresh) \ No newline at end of file diff --git a/entry/oh-package-lock.json5 b/entry/oh-package-lock.json5 index 598d42f..c59a0f5 100644 --- a/entry/oh-package-lock.json5 +++ b/entry/oh-package-lock.json5 @@ -6,18 +6,30 @@ "lockfileVersion": 3, "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", "specifiers": { - "@duke/component-lifecycle@^1.0.2": "@duke/component-lifecycle@1.0.2", + "@duke/component-lifecycle@^1.0.2": "@duke/component-lifecycle@1.0.3", + "@duke/component-lifecycle@^1.0.3": "@duke/component-lifecycle@1.0.3", + "@duke/view-model@^1.0.0": "@duke/view-model@1.0.0", "eventpost@../library": "eventpost@../library", "libnative_event_post.so@../library/src/main/cpp/types/libeventpost": "libnative_event_post.so@../library/src/main/cpp/types/libeventpost" }, "packages": { - "@duke/component-lifecycle@1.0.2": { + "@duke/component-lifecycle@1.0.3": { "name": "@duke/component-lifecycle", - "version": "1.0.2", - "integrity": "sha512-giz0mfwnTzYJ4OfijQv6LAT5uNh8RDRcrwrLjvB6q7KQHFDNXE6lC3gnxOEZjXSs1Npmx0hr2DW9MVJqWueVTA==", - "resolved": "https://ohpm.openharmony.cn/ohpm/@duke/component-lifecycle/-/component-lifecycle-1.0.2.har", + "version": "1.0.3", + "integrity": "sha512-sj13jLH/PcRKUpsYXUX2CYs5Z7QoMvTeTeZelIvKakVcV2RyRnH+wYOVsQfu+ymDX6PyZvFMfdOse8NJU4gTpQ==", + "resolved": "https://ohpm.openharmony.cn/ohpm/@duke/component-lifecycle/-/component-lifecycle-1.0.3.har", "registryType": "ohpm" }, + "@duke/view-model@1.0.0": { + "name": "@duke/view-model", + "version": "1.0.0", + "integrity": "sha512-QuAz7n0lWCCJVFDFhbzGIrivOqkaHitYz1xo6omW11YVv/cl0/USLnrB3vfDV+at+M+OjpA2+8LcglZoD/sUlg==", + "resolved": "https://ohpm.openharmony.cn/ohpm/@duke/view-model/-/view-model-1.0.0.har", + "registryType": "ohpm", + "dependencies": { + "@duke/component-lifecycle": "^1.0.3" + } + }, "eventpost@../library": { "name": "eventpost", "version": "2.1.2", @@ -25,7 +37,8 @@ "registryType": "local", "dependencies": { "libnative_event_post.so": "file:./src/main/cpp/types/libeventpost", - "@duke/component-lifecycle": "^1.0.2" + "@duke/component-lifecycle": "^1.0.2", + "@duke/view-model": "^1.0.0" } }, "libnative_event_post.so@../library/src/main/cpp/types/libeventpost": { diff --git a/library/CHANGELOG.md b/library/CHANGELOG.md index d34796e..a898e1d 100644 --- a/library/CHANGELOG.md +++ b/library/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [v2.2.0] 2025.09.04 + +- 添加对ViewModel的支持 + ## [v2.1.2] 2025.09.02 - 修改Subscriber方法申明,帮助IDE寻找装饰器,提升使用者开发效率 diff --git a/library/README.md b/library/README.md index 4bf62a3..0c7cf3f 100644 --- a/library/README.md +++ b/library/README.md @@ -1,7 +1,8 @@ # EventPost ## 简介 -[![openHarmony](https://img.shields.io/badge/openharmony-v2.1.2-brightgreen)](https://gitee.com/Duke_Bit/eventpost/releases/tag/v2.1.2) + +[![openHarmony](https://img.shields.io/badge/openharmony-v2.2.0-brightgreen)](https://gitee.com/Duke_Bit/eventpost/releases/tag/v2.2.0) EventPost是一款消息总线,具有生命周期感知能力,支持Sticky。 @@ -65,7 +66,18 @@ EventPost.getDefault().onFromComponent("msgId", this, (arg1:object, arg2:object) }) ``` -- 三种注册方式任性其一,onFromComponent 和装饰器均能感知组件生命周期 +在ViewModel中使用onFromViewModel + +```typescript +import { EventPost } from "eventpost"; + +EventPost.getDefault().onFromViewModel("msgId", this, (arg1:object, arg2:object) => { +}) +``` +ViewModel的使用请参考[ViewModel](https://gitee.com/Duke_Bit/view-model) +直接new不加装饰器的话,还是会有内存泄露的 + +- 四种注册方式任性其一,onFromComponent、onFromViewModel 和装饰器均能感知组件生命周期 - 使用on的方法注册的话,需要自行off防止内存泄漏 ### 发送消息 @@ -86,6 +98,7 @@ EventPost.getDefault().post("msgId", "arg1", { params1: "bbb" }) | setAllSticky | boolean | 配置基础消息发送是否为粘性事假,默认为粘性,跨线配置非粘性,则每个线程均要初始化 | | on | string,function,sticky,callThis | 注册订阅方法,并配置是否支持粘性 | | onFromComponent | string,component,function,sticky | 注册订阅方法,并配置是否支持粘性,仅支持组件内注册,能够自动反注册 | | +| onFromViewModel | string,ViewModel,function,sticky | 注册订阅方法,并配置是否支持粘性,仅支持ViewModel内注册,能够自动反注册 | | | off | string,function | 反注册订阅方法 | | once | string,function,callThis | 注册一次性订阅方法 | | post | string,...args:any[] | 发送消息(受配置影响) | @@ -131,10 +144,17 @@ DevEco Studio: 5.0.5.315, SDK: HarmonyOS 5.0.1 Release Ohos_sdk_public 5.0.1.115 ## 其他库 -- [@duke/logan-ext](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan-ext) Logan扩展库,方便开箱即用: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) -- [@duke/logan](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan) Logan是一个为OpenHarmony开发的日志库,对美团技术团队的Logan的鸿蒙化移植版本: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) +- [@duke/view-model](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fview-model) + 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/view-model](https://gitee.com/Duke_Bit/view-model) +- [@duke/logan-ext](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan-ext) + Logan扩展库,方便开箱即用: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) +- [@duke/logan](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Flogan) + Logan是一个为OpenHarmony开发的日志库,对美团技术团队的Logan的鸿蒙化移植版本: [https://gitee.com/Duke_Bit/logan](https://gitee.com/Duke_Bit/logan) - [@duke/websocket-client](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fwebsocket-client) WebSocket库解决官方API的一些bug问题: [https://gitee.com/Duke_Bit/websocket](https://gitee.com/Duke_Bit/websocket) -- [@duke/component-lifecycle](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fcomponent-lifecycle) 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/component-lifecycle](https://gitee.com/Duke_Bit/component-lifecycle) -- [@duke/elf-dialog](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-dialog) CustomDialog黑魔法 不依赖promptAction 实现的函数级弹窗,省去复杂的模版代码,让你专注于你的业务,一行代码搞定弹窗: [https://gitee.com/Duke_Bit/elf-dialog](https://gitee.com/Duke_Bit/elf-dialog) -- [@duke/elf-refresh](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-refresh) OpenHarmony 刷新组件,支持下拉刷新和上拉加载更多,支持各种组件,List、Grid,支持header,footer,目标打造HarmonyOS的SmartRefreshLayout: [https://gitee.com/Duke_Bit/ElfRefresh](https://gitee.com/Duke_Bit/ElfRefresh) \ No newline at end of file +- [@duke/component-lifecycle](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Fcomponent-lifecycle) + 鸿蒙版本的Lifecycle库,支持组件、Router和Navigation: [https://gitee.com/Duke_Bit/component-lifecycle](https://gitee.com/Duke_Bit/component-lifecycle) +- [@duke/elf-dialog](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-dialog) CustomDialog黑魔法 不依赖promptAction + 实现的函数级弹窗,省去复杂的模版代码,让你专注于你的业务,一行代码搞定弹窗: [https://gitee.com/Duke_Bit/elf-dialog](https://gitee.com/Duke_Bit/elf-dialog) +- [@duke/elf-refresh](https://ohpm.openharmony.cn/#/cn/detail/@duke%2Felf-refresh) OpenHarmony + 刷新组件,支持下拉刷新和上拉加载更多,支持各种组件,List、Grid,支持header,footer,目标打造HarmonyOS的SmartRefreshLayout: [https://gitee.com/Duke_Bit/ElfRefresh](https://gitee.com/Duke_Bit/ElfRefresh) \ No newline at end of file diff --git a/library/oh-package.json5 b/library/oh-package.json5 index 0859cf7..d7c1ee5 100644 --- a/library/oh-package.json5 +++ b/library/oh-package.json5 @@ -1,6 +1,6 @@ { "name": "eventpost", - "version": "2.1.2", + "version": "2.2.0", "description": "事件分发,支持组件中的lifecycle,在组件中使用自动取消订阅", "main": "Index.ts", "author": "duke", @@ -17,6 +17,7 @@ "homepage": "https://gitee.com/Duke_Bit", "dependencies": { "libnative_event_post.so": "file:./src/main/cpp/types/libeventpost", - "@duke/component-lifecycle": "^1.0.2" + "@duke/component-lifecycle": "^1.0.2", + "@duke/view-model": "^1.0.0" } } \ No newline at end of file diff --git a/library/src/main/ets/EventPost.ts b/library/src/main/ets/EventPost.ts index f9854cb..2dc593c 100644 --- a/library/src/main/ets/EventPost.ts +++ b/library/src/main/ets/EventPost.ts @@ -1,3 +1,4 @@ +import { ViewModel } from '@duke/view-model' import { Dispatch } from './Dispatch' export class EventPost { @@ -51,6 +52,17 @@ export class EventPost { } + /** + * ViewModel + * @param TypeName + * @param viewModel + * @param callback + * @param sticky + */ + onFromViewModel(TypeName: string, viewModel: ViewModel, callback: Function, sticky: boolean = false){ + + } + off(TypeName: string, callback: Function) { this.dispatch.off(TypeName, callback) } diff --git a/library/src/main/ets/EventPostExtensions.ts b/library/src/main/ets/EventPostExtensions.ts index 6ebca14..03c2e77 100644 --- a/library/src/main/ets/EventPostExtensions.ts +++ b/library/src/main/ets/EventPostExtensions.ts @@ -5,6 +5,7 @@ import { EVENT_COMPONENT_EVENT_CACHE } from './Constants' import { EventOnInfo } from './EventOnInfo' import { systemDateTime } from '@kit.BasicServicesKit' import { FrameNode, UIContext, uiObserver } from '@kit.ArkUI' +import { ViewModel } from '@duke/view-model' EventPost.getDefault().onFromComponent = function (TypeName: string, component: any, callback: Function, sticky: boolean = false) { @@ -115,4 +116,24 @@ EventPost.getDefault().onFromComponent = } } } - } \ No newline at end of file + } + +EventPost.getDefault().onFromViewModel = function (TypeName: string, viewModel: ViewModel, callback: Function, sticky: boolean = false) { + let cache:Array | undefined = viewModel['_registerEventPost'] + if(!cache){ + cache = viewModel['_registerEventPost'] = new Array() + let oldFunction = viewModel.clean + viewModel.clean = function () { + cache?.forEach(item => { + EventPost.getDefault().off(item.typeName, item.callBack) + }) + oldFunction.call(ViewModel) + } + } + cache.push({ + typeName: TypeName, + methodName: '', + sticky, + callBack: callback + }) +} \ No newline at end of file -- Gitee