HarmonyOS 鴻蒙應用開發基礎:EventHub,優雅解決跨組件通信難題

EventHub是鴻蒙開發中用于線程內通信的事件中心模塊,基于發布訂閱模式實現組件間的高效通信。它完美解決了傳統回調方式在多層嵌套場景下的痛點,使得組件間的通信更加靈活和易于管理。

核心特性
  1. 事件中心機制:通過事件名進行通信,實現解耦,提高組件間的獨立性。
  2. 線程內通信:僅支持同一線程內的事件傳遞,不適用于跨進程或虛擬機間的通信。
  3. 單例模式:每個AbilityContext實例擁有獨立的EventHub,確保事件操作僅作用于當前上下文。
基礎用法

以下是一個簡單的EventHub使用案例,展示了如何在組件之間進行數據傳遞:

@Entry
@Component
struct DemoPage {aboutToAppear(): void {// 訂閱事件getContext().eventHub.on("test", (data: string) => {console.log("接收數據:" + data)})}build() {Column() {Button("觸發事件").onClick(() => {// 發布事件getContext().eventHub.emit("test", "示例數據")})}}
}

在這個例子中,點擊按鈕后觸發test事件,并發送一個字符串參數。DemoPageaboutToAppear生命周期中訂閱了test事件,當事件被觸發時,接收并打印發送的消息。

API詳解

EventHub提供了三個主要方法:

  • on(event: string, callback: Function): void;

    • 參數
      • event: 事件名稱。
      • callback: 回調函數。
    • 說明:訂閱指定事件。
  • off(event: string, callback?: Function): void;

    • 參數
      • event: 事件名稱。
      • callback (可選): 回調函數。
    • 說明:取消訂閱事件。如果提供了回調函數,則取消該回調對指定事件的訂閱;否則取消所有回調對該事件的訂閱。
  • emit(event: string, …args: Object[]): void;

    • 參數
      • event: 事件名稱。
      • ...args: 可變參數。
    • 說明:觸發指定事件,并可傳遞參數給訂閱該事件的回調函數。
實戰案例:組件間通信

以下是一個更復雜的實戰案例,展示了父組件和子組件之間的通信:

@Entry
@Component
struct ParentComponent {@State message: string = ""aboutToAppear(): void {// 訂閱事件getContext().eventHub.on("childEvent", (data: string) => {this.message = data})}aboutToDisappear(): void {// 取消訂閱事件getContext().eventHub.off("childEvent")}build() {Column() {Text(this.message)ChildComponent()}}
}@Component
struct ChildComponent {@State count: number = 0build() {Button("通知父組件").onClick(() => {this.count++// 觸發事件并發送參數getContext().eventHub.emit("childEvent", `點擊次數: ${this.count}`)})}
}

在這個例子中,ChildComponent中的按鈕每次被點擊時會觸發childEvent事件,并將點擊次數傳遞給ParentComponentParentComponent訂閱了該事件,并在事件觸發時更新message狀態并顯示在界面上。

最佳實踐
  1. 及時取消訂閱:在aboutToDisappear生命周期中取消訂閱,避免內存泄漏。
  2. 命名規范化:使用常量定義事件名,避免硬編碼錯誤。
  3. 參數設計:合理設計事件參數結構,保持接口簡潔。
  4. 單一職責:每個事件應只處理單一業務邏輯,確保代碼的清晰和可維護性。
適用場景
  • 跨多級組件通信:適用于多層嵌套組件間的通信。
  • 狀態變更通知:用于通知組件狀態的變化。
  • 數據回傳:從子組件向父組件回傳數據。
  • 松耦合的模塊交互:實現模塊間的松耦合通信。
總結

EventHub以其簡潔的API和高效的通信機制,成為鴻蒙應用開發中組件通信的首選方案。通過EventHub,開發者可以輕松地實現跨組件的數據傳遞和狀態通知,提升應用的開發效率和用戶體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端框架token相關bug,前后端本地聯調

今天我搭建框架的時候,我想請求我自己的本地!然后我自己想鏈接我自己的本地后端,我之前用的前端項目,都是鏈別人的后端,基本上很少情況會鏈接自己的后端!所以我當時想的是,我前后端接口一樣&…

【數據結構初階】順序表專題

文章目錄 順序表1.數據結構相關概念1、什么是數據結構2、為什么需要數據結構? 2.順序表1、順序表的概念及結構2、順序表分類3、動態順序表的實現1.定義一個動態順序表2.順序表的初始化3.順序表的銷毀4.順序表達的尾插5.順序表的頭插6.空間大小檢查函數7.順序表的尾刪…

從神經生物學到社會心理學:游戲沉迷機制的深度解構

你是否曾在深夜放下手機時驚覺:"明明只想玩10分鐘,怎么天都亮了?"這不是意志力薄弱的表現,而是價值數十億美元的游戲產業用神經科學精心設計的認知陷阱。 當《王者榮耀》的Victory音效讓你心跳加速,當《原神…

15.集合框架的學習

一、簡介 集合框架(Collection Framework) 是 Java 提供的一套用于存儲、操作和處理數據集合的標準化架構。它主要位于 java.util 包中,提供了一組 接口 和 實現類,用于操作不同類型的數據集合,如列表(List…

【方案分享】展廳智能講解:基于BLE藍牙Beacon的自動講解觸發技術實現

【方案分享】展廳智能講解:基于BLE藍牙Beacon的自動講解觸發技術實現 讓觀眾靠近展品即可自動彈出講解頁面,是智能展廳的核心功能之一。本文將從軟硬件技術、BLE Beacon原理、微信小程序實現、優劣對比與拓展方案五個維度,系統講解“靠近展臺…

微前端架構:從單體到模塊化的前端新革命

在信息技術(IT)的迅猛發展中,前端開發領域正迎來一場顛覆性的變革 —— 微前端架構(Micro - Frontends)。2025 年,隨著 Web 應用的復雜性激增、團隊協作需求的增長以及用戶對無縫體驗的期待,微前…

React中常用的鉤子函數:

一. 基礎鉤子 (1)useState 用于在函數組件中添加局部狀態。useState可以傳遞一個參數,做為狀態的初始值,返回一個數組,數組的第一個元素是返回的狀態變量,第二個是修改狀態變量的函數。 const [state, setState] useState(ini…

如何在 Windows 11 或 10 上通過 PowerShell 安裝 Docker Desktop

了解如何使用 PowerShell 或命令提示符在 Windows 11 或 10 上安裝 Docker CLI 和 Docker Desktop GUI,以創建容器運行虛擬機。無需手動訪問網站下載安裝程序,所有操作都將在命令終端完成。 Docker 是一個強大的容器化平臺,允許開發人員將應用程序及其依賴項打包為輕量級容…

Python實例題:人機對戰初體驗Python基于Pygame實現四子棋游戲

目錄 Python實例題 題目 代碼實現 實現原理 游戲邏輯: AI 算法: 界面渲染: 關鍵代碼解析 游戲棋盤渲染 AI 決策算法 勝利條件檢查 使用說明 安裝依賴: 運行游戲: 游戲操作: 擴展建議 增強…

一文詳解 HLS

1 HLS的簡介 1.1 HLS的背景 從 RTMP(Real-Time Messaging Protocol,實時消息傳輸協議) 到 HLS(HTTP Live Streaming,HTTP直播流) 的技術演進,本質上是直播協議從 專有協議 向 通用 Web 協議 的…

go 訪問 sftp 服務 github.com/pkg/sftp 的使用踩坑,連接未關閉(含 sftp 服務測試環境搭建)

前言 最近在使用 sftp 服務時,被告知發起了海量的連接,直接把服務器搞崩,ip 被封了。 這是啥情況? golang 寫的代碼,我就正常的訪問 sftp 服務,連接使用過后也都關閉了,咋會出現連接一直連著…

Android 直接通過 app_process 啟動的應用如何使用 Context

文章目錄 一、問題背景二、代碼實現三、代碼詳解 一、問題背景 在 Android 中,可以使用 Android Studio 編寫 Java 應用程序,通過編譯打包成 apk 文件,然后將文件推送至 /data/local/tmp 等可執行的目錄或安裝打包出來的應用,隨后…

【數據結構與算法】LeetCode 每日三題

如果你已經對數據結構與算法略知一二,現在正在復習數據結構與算法的一些重點知識 ------------------------------------------------------------------------------------------------------------------------- 點贊收藏🌈,每天更新總結文…

深度“求索”:DeepSeek+Dify構建個人知識庫

目錄 前言 環境部署 安裝Docker 安裝Dify 配置Dify 部署知識庫 創建應用 前言 在當今數字化信息爆炸的時代,數據隱私和個性化知識管理成為企業和個人關注的焦點。Dify,作為一款備受矚目的開源 AI 應用開發平臺,為用戶提供了完整的私有…

【Redis8】最新安裝版與手動運行版

目錄 一、直接運行 1. 下載 Redis百度網盤 2. 解壓后直接運行 redis-server.exe?編輯 二、安裝版運行 雙擊 install_redis_service.bat 輸入安裝路徑(請提前創建好安裝路徑)后直接回車?編輯 下一步直接回車即可,因為是使用配置模板…

@Column 注解屬性詳解

提示:文章旨在說明 Column 注解屬性如何在日常開發中使用,數據庫類型為 MySql,其他類型數據庫可能存在偏差,需要注意。 文章目錄 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…

使用Gemini, LangChain, Gradio打造一個書籍推薦系統 (第二部分)

建立向量嵌入數據庫 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…

【Go-4】函數

函數 函數是編程中的基本構建塊,用于封裝可重用的代碼邏輯。Go語言中的函數功能強大,支持多種特性,如多返回值、可變參數、匿名函數、閉包以及將函數作為值和類型傳遞。理解和掌握函數的使用對于編寫高效、可維護的Go程序至關重要。本章將詳…

【已解決】HBuilder X編輯器在外接顯示器或者4K顯示器怎么界面變的好小問題

觸發方式:主要涉及DPI縮放問題,可能在電腦息屏有概率觸發 修復方式: 1.先關掉軟件直接更改屏幕縮放,然后打開軟件,再關掉軟件恢復原來的縮放,再打開軟件就好了 2.(不推薦)右鍵HBuilder在屬性里…

spark調度系統核心組件SparkContext、DAGSchedul、TaskScheduler、Taskset介紹

目錄 1. SparkContext2.DAGScheduler3. TaskScheduler4. 協作關系5 TaskSet的定義6. 組件關系說明Spark調度系統的核心組件主要有SparkContext、DAGScheduler和TaskScheduler SparkContext介紹 1. SparkContext 1、資源申請: SparkContext是Spark應用程序與集群管理器(如St…