精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS基礎之JS UI任意組件通訊

開發 前端 OpenHarmony
組件間的通信主要作用是能在組件間傳遞數據或者執行相關的業務邏輯,對于鴻蒙應用組件,下面將對幾種組件間的通信方式進行代碼實現,其中包括實現自定義實現任意組件通信。

[[423582]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

組件間的通信主要作用是能在組件間傳遞數據或者執行相關的業務邏輯,對于鴻蒙應用組件,下面將對幾種組件間的通信方式進行代碼實現,其中包括實現自定義實現任意組件通信。

文件結構

首先我們準備好幾個組件 parent組件、current組件、child1組件、child2組件,其中parent與current是父子組件關系、curren與child1/child2是父子組件關系、child1與child2是兄弟組件關系、parent與child1/child2是跨層級組件的關系,詳細的代碼文件可以參考附件源碼,最終預覽得到結果如下:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

父子關系通信

parent與current是父子組件關系,在current.js中props的title=''current-title",在parent.hml中使用current組件時傳入title="parent"時,current組件顯示parent,這里使用了props由父組件向子組件傳遞title值進行通信,預覽結果見下圖:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區
HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

curren與child1/child2是父子組件關系,在current組件中有三個按鈕 改變parent、改變child1、改變child2,按鈕配置如下:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在curren組件中,點擊改變parent按鈕會觸發changeParent方法,點擊改變child1按鈕會觸發changeChild1方法,點擊改變child1按鈕會觸發changeChild1方法,這些方法會改變對應組件中的數據,如下:

點擊改變parent按鈕,通過使用$parent方法得到parent組件的實例,然后通過實例對象與parent組件進行數據通信:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

點擊改變child1,通過使用$child方法得到child1組件的實例,然后通過實例對象與child1組件進行數據通信:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

點擊改變child2,通過使用$child方法得到child2組件的實例,然后通過實例對象與child2組件進行數據通信:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在changeParent方法中使用this.$parent()方法來獲取了parent組件的ViewModel,從而可以訪問和改變parent組件的數據

在changeChild1和changeChild2中使用了this.$child(id)方法來獲取child1/child2組件的ViewModel,從而可以訪問和改變child1/child2組件的數據

除了使用this.$parent方法外還可以使用自定義事件的方式來進行子組件調用父組件方法來向父組件傳值,parent組件在引用current組件時綁定事件,在current組件中調用this.$emit方法來觸發綁定的自定義事件。

parent.hml中綁定自定義的eventEmit方法

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區
HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

current.js中使用this.$emit方法觸發eventEmit方法:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

 

總結下來,父子組件間的通信方式大概有幾種方法:

  • props:用于父組件向子組件傳遞數據
  • $emit:用于自組件向父組件傳遞數據或調用父組件方法
  • $parent:用于獲取父組件ViewModel從而可以修改父組件數據和調用父組件方法
  • $child:用于獲取子組件ViewModel從而修改子組件數據和調用子組件方法

兄弟關系與跨層級組件間通信

根據上面父子組件的通信方式,對于兄弟組件和跨層級組件之間,可以組合使用上面的幾種方法組合的方式可以實現非父子組件間的通信,但是如果組件間嵌套比較復雜,嵌套層級比較多的情況下,使用以上方法組合的方式顯然不太方便,在這里嘗試實現一種類似vue bus全局通信的方式來進行任意組件間的通信。

在JS API中app.js文件中定義的數據可以通過this.app.app.def獲取,根據這個特性和使用觀察者模式來設計一可以全局訂閱響應的通信模式。

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

eventBus

首先我們定義evnetBus.js文件,在里面定義相關的訂閱、發布和取消訂閱的方法:

  1. const Bus = { 
  2.     // 發布的事件集合 
  3.     $events:{}, 
  4.   
  5.     /** 
  6.      * 發布事件方法 
  7.      * type: string 字符串 
  8.      * fun: function 綁定的方法 
  9.      * */ 
  10.     $on(type,fun){ 
  11.   
  12.     }, 
  13.   
  14.     /** 
  15.      * 觸發事件方法 
  16.      * type: string 發布事件的字符串 
  17.      * args: 傳參 
  18.      * */ 
  19.     $emit(type,...args){ 
  20.   
  21.     }, 
  22.   
  23.     /** 
  24.     * 注銷事件方法 
  25.     * type: string 字符串 
  26.     * fun: string|function 發布事件時返回的值或者發布的原function 
  27.     * */ 
  28.     $off(type,fun){ 
  29.       
  30.     } 
  31. export default Bus; 

 在里面我們定義了$events對象用于綁定事件的存放,$on方法用于綁定事件,$emit方法用于觸發事件,$off方法用于注銷事件,完整的eventBus.js如下:

eventBus.js

  1. const Bus = { 
  2.     // 發布的事件集合 
  3.     $events:{ }, 
  4.   
  5.     /** 
  6.      * 發布事件方法 
  7.      * type: string 字符串 
  8.      * fun: function 綁定的方法 
  9.      * */ 
  10.     $on(type,fun){ 
  11.         let res = ""
  12.         if(type && typeof type == "string" && fun && typeof fun =="function"){ 
  13.             let events = this.$events[type]; 
  14.             if(events){ 
  15.                 let index = events.findIndex(null); 
  16.                 if(index > -1){ 
  17.                     res = `${String(index)}${type}`; 
  18.                     events[index] = fun; 
  19.                 }else
  20.                     events.push(fun); 
  21.                 } 
  22.             }else
  23.                 this.$events[type] = [fun]; 
  24.                 res = `0${type}`; 
  25.             } 
  26.   
  27.         } 
  28.         return res; 
  29.     }, 
  30.   
  31.     /** 
  32.      * 觸發事件方法 
  33.      * type: string 發布事件的字符串 
  34.      * args: 傳參 
  35.      * */ 
  36.     $emit(type,...args){ 
  37.         if(type && typeof type == "string"){ 
  38.             let events = this.$events[type]; 
  39.             if(events){ 
  40.                 events.forEach(fun => { 
  41.                     if(fun && typeof fun =="function"){ 
  42.                         fun(...args); 
  43.                     } 
  44.                 }); 
  45.             } 
  46.         } 
  47.     }, 
  48.   
  49.     /** 
  50.      * 注銷事件方法 
  51.      * type: string 字符串 
  52.      * fun: string|function 發布事件時返回的值或者發布的原function 
  53.      * */ 
  54.     $off(type,fun){ 
  55.         if(type && typeof type == "string" && fun){ 
  56.             let events = this.$events[type]; 
  57.             if(events){ 
  58.                 if(typeof fun == "string"){ 
  59.                     let indexStr = fun.replace(type,''); 
  60.                     let index = parseInt(indexStr); 
  61.                     events[index] = null
  62.                 } 
  63.                 if(typeof fun == "function"){ 
  64.                     events.forEach(item => { 
  65.                         if(item == fun){ 
  66.                             item = null
  67.                         } 
  68.                     }); 
  69.                 } 
  70.             } 
  71.         } 
  72.     } 
  73.   
  74. export default Bus; 

使用方法

引入

首先在app.js中引入eventBus,將eventBus綁定在我們的全局對象上:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

綁定

在parent組件的onInit方法中綁定事件,可以通過綁定的事件來改變parent組件的值,使用this.$app.$def方法獲取全局app下掛載的eventBus對象:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

觸發

然后我們修改child1組件,添加按鈕使用eventBus對象的$emit方法來觸發bus事件:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在觸發方法的時候我們傳入了自定義參數數據"123456789"

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在點擊按鈕后將會觸發我們在parent組件中綁定的方法從而改變parent組件數據,同時也接收到了child組件傳過來的數據"123456789"

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在此就實現了跨層級組件間的通信,此方法可以對任意組件間的事件觸發和傳值都有效,限于篇幅不再展示,最后我們還要在組件銷毀的時候注銷我們綁定的事件。

注銷

我們定義一個注銷事件的按鈕并綁定注銷事件:

HarmonyOS 基礎之JS UI任意組件通訊-鴻蒙HarmonyOS技術社區

在我們$on綁定事件的時候可以得到一個返回值,這個值也可以用于事件的注銷,在這里就不做演示了,有興趣的可以下去嘗試一下。

總結

以上就是使用觀察者模式實現了一個簡易版的事件總線機制可以在任意組件間通信,基本功能可以實現,還有一些缺點需要提示:

首先這個在使用的時候必須依賴鴻蒙JS API this.$app.$def 這個方法,每次使用都要用這個來獲取eventBus對象。

在注冊綁定事件后一定要記得在當前組件銷毀的時候注銷綁定的事件,否則可能會造成內存泄露。

事件注銷有兩種方式,需要稍微理解注銷事件的原理才能熟練使用。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-08-24 14:57:27

鴻蒙HarmonyOS應用

2021-10-14 15:14:36

鴻蒙HarmonyOS應用

2021-08-12 15:01:09

鴻蒙HarmonyOS應用

2021-09-15 10:19:15

鴻蒙HarmonyOS應用

2021-11-01 10:21:36

鴻蒙HarmonyOS應用

2021-12-10 10:12:44

鴻蒙HarmonyOS應用

2020-11-17 11:48:44

HarmonyOS

2022-05-20 14:34:20

list組件鴻蒙操作系統

2020-11-25 12:02:02

TableLayout

2011-08-01 15:57:58

2011-04-14 10:05:16

BlackBerry

2011-04-14 10:03:32

UI組件BlackBerry

2021-11-24 10:02:53

鴻蒙HarmonyOS應用

2012-09-18 09:20:06

2023-10-12 12:43:16

組件Vue

2023-12-29 08:37:59

2022-04-24 14:56:53

容器組件StackTS

2021-01-20 13:50:36

鴻蒙HarmonyOS應用開發

2011-07-06 09:34:19

JAVASCRIPT

2025-01-14 15:12:13

點贊
收藏

51CTO技術棧公眾號

国产精品毛片高清在线完整版| 亚洲一区日韩在线| 欧美成人r级一区二区三区| 欧美极品少妇无套实战| 天天操天天射天天| 日韩av成人高清| 欧美老女人性生活| 高潮毛片无遮挡| 精品国产麻豆| 日韩欧美在线字幕| 粉嫩av一区二区三区天美传媒| 亚洲av成人无码网天堂| 久久99最新地址| 国内偷自视频区视频综合| 手机看片日韩av| 精品国产乱子伦一区二区| 欧美视频你懂的| 国产九九九九九| 成人区精品一区二区不卡| 99在线热播精品免费| 成人激情黄色网| 日韩一区二区视频在线| 亚洲最新色图| 在线观看日韩欧美| 一级欧美一级日韩片| 天天综合在线观看| 一本色道久久综合亚洲91| 国产传媒久久久| 拍真实国产伦偷精品| 成人av高清在线| 亚洲精品欧美日韩专区| 国产精品成人久久久| 国产亚洲一级| 久久久欧美一区二区| 色欲一区二区三区精品a片| 国产一区二区电影在线观看| 亚洲福利在线视频| 一卡二卡三卡四卡五卡| 青青伊人久久| 欧美日韩视频在线第一区| 三级4级全黄60分钟| 超清av在线| 亚洲国产美国国产综合一区二区| 性欧美18一19内谢| 永久免费在线观看视频| 亚洲国产精品成人综合| 热re99久久精品国产99热| 青青九九免费视频在线| 成人激情免费电影网址| 99久久精品免费看国产一区二区三区| 在线观看免费观看在线| 日产国产欧美视频一区精品| 国产经典一区二区| 亚洲大尺度在线观看| 丝袜美腿亚洲综合| 日本精品久久久久影院| 国产婷婷色一区二区在线观看| 国产精品久久777777毛茸茸| 清纯唯美日韩制服另类| 日韩熟女一区二区| 日日摸夜夜添夜夜添精品视频| 日本aⅴ大伊香蕉精品视频| 久久精品视频7| 天堂午夜影视日韩欧美一区二区| 日产精品久久久一区二区福利| 黑人精品无码一区二区三区AV| 亚洲一区一卡| 国产精品爽黄69天堂a| 国产一区二区三区四区视频| 久久国产精品区| 丁香五月网久久综合| 懂色av一区二区三区四区| 91亚洲精华国产精华精华液| 老牛影视免费一区二区| av中文字幕一区二区三区| 国产精品国产自产拍在线| 国产在线无码精品| 欧美aa免费在线| 欧美亚洲免费在线一区| 日韩欧美理论片| 老司机成人在线| 亚洲最大在线视频| 欧美一级片在线视频| 好看的亚洲午夜视频在线| 午夜精品一区二区三区视频免费看| 四虎精品永久在线| 久久成人免费日本黄色| 国产精品一区视频网站| 酒色婷婷桃色成人免费av网| 国产精品灌醉下药二区| 亚洲 欧美 综合 另类 中字| 欧美极品免费| 日韩一卡二卡三卡四卡| 国产熟妇搡bbbb搡bbbb| 91精品一区二区三区综合在线爱| 久久久久亚洲精品国产| 天天天天天天天干| 成人午夜精品一区二区三区| 日韩欧美亚洲日产国| av毛片在线看| 在线国产亚洲欧美| 亚洲成人福利视频| 精品日产免费二区日产免费二区| 久久综合五月天| 天天操夜夜操视频| 国产成人av电影免费在线观看| 免费国产在线精品一区二区三区| 成人日日夜夜| 欧美伊人精品成人久久综合97| 第一页在线视频| 成人直播大秀| 91高清免费在线观看| 999av视频| 国产无一区二区| 香港三级日本三级a视频| 亚洲精品在线影院| 亚洲精品成人久久电影| 久久久久久久久毛片| 日韩av一二三| 欧美精品成人一区二区在线观看| 4438全国成人免费| 青青草av在线播放| 国产老肥熟一区二区三区| 日本一区不卡| 在线一区av| 亚洲精品v天堂中文字幕 | 综合欧美亚洲| 最近中文字幕日韩精品 | 高清不卡亚洲| 欧美精品一区二区三区一线天视频 | 青青青青在线视频| 在线成人免费| 久久精品亚洲一区| 亚洲视频在线观看免费视频| 久久精品亚洲麻豆av一区二区| 精品无码一区二区三区爱欲| 日韩08精品| 久久av资源网站| 国产麻豆免费视频| 国产精品久久久久久亚洲伦 | 日韩不卡视频在线观看| 日韩电影大全免费观看2023年上| 久久久久久久久久久久久久免费看 | 亚洲免费在线播放视频| 99re66热这里只有精品8| 国产精品成人aaaaa网站| 韩国三级在线观看久| 一本一本久久a久久精品综合麻豆| 人妻丰满熟妇aⅴ无码| 性久久久久久| 日本不卡一区| 成人黄色视屏网站| 色偷偷av一区二区三区| 国产精品亚洲欧美在线播放| 国产精品免费网站在线观看| 97超碰成人在线| 91精品久久久久久久久久不卡| 91精品一区二区| 91高清在线观看视频| 欧美一区二区三区白人| 国产av无码专区亚洲av毛网站| 国产精品123| wwwwww欧美| 欧美日韩一区二区三区在线电影 | 亚洲欧洲日本专区| 无码人妻丰满熟妇奶水区码| 中文字幕成人网| 91亚洲精品久久久蜜桃借种| 欧美一区影院| 精品欧美日韩在线| 欧美日韩激情电影| 久久久精品网站| 蜜桃久久一区二区三区| 色综合久久中文综合久久97| 成年人免费视频播放| 国产一区二区网址| av之家在线观看| 欧美日中文字幕| y111111国产精品久久婷婷| 91美女主播在线视频| 亚洲欧美第一页| 91激情在线观看| 亚洲国产日日夜夜| 国产熟女一区二区| 成人一级片网址| 狠狠操精品视频| 911久久香蕉国产线看观看| 国产视频在线观看一区| 国产精品第一国产精品| 欧美情侣性视频| 久草福利在线| 日韩视频一区二区在线观看| www.com亚洲| 亚洲一区中文在线| 51妺嘿嘿午夜福利| 国产91丝袜在线播放0| 中文字幕在线导航| 亚洲久色影视| 亚洲一区三区| 最新国产精品视频| 91网免费观看| 成人在线视频观看| 57pao成人永久免费视频| 成人福利网站| 中文国产成人精品久久一| 亚洲大尺度网站| 欧美日韩一区二区三区四区五区 | 牛牛精品在线视频| 中文国产成人精品久久一| 姝姝窝人体www聚色窝| 制服丝袜亚洲播放| 在线精品免费视| 亚洲国产日日夜夜| 欧美成人三级视频| 日本一区二区三区久久久久久久久不| 日本国产在线视频| 国产在线精品一区在线观看麻豆| 麻豆传传媒久久久爱| 一区三区视频| 美女黄色免费看| 永久91嫩草亚洲精品人人| 日韩aⅴ视频一区二区三区| 久久资源综合| 国产精品免费一区二区三区四区| 日本一区二区三区中文字幕| 国产精品白丝jk喷水视频一区| 黄色漫画在线免费看| 久久久久久香蕉网| 少女频道在线观看高清| 久久亚洲春色中文字幕| 一级毛片视频在线| 伊人激情综合网| 电影av一区| 伊人一区二区三区久久精品| 亚州av在线播放| 亚洲精品97久久| 无码精品视频一区二区三区| 亚洲白拍色综合图区| 亚洲精品国产精品乱码不卡| 日韩欧美激情在线| 性一交一乱一伧老太| 日韩精品一区二区三区在线播放 | 手机在线视频你懂的| 日韩在线精品| 中文字幕一区二区三区四区五区六区 | 麻豆精品一区二区三区| 成人午夜激情av| 美女一区二区久久| 五月婷婷六月丁香激情| 麻豆成人91精品二区三区| 91亚洲免费视频| 精品一区二区在线免费观看| 男生操女生视频在线观看| 激情综合网激情| 国产大学生av| av一区二区久久| 伊人网伊人影院| 中文字幕av一区二区三区高| 日韩精品久久久久久久的张开腿让| 国产精品国产三级国产有无不卡 | 麻豆传媒视频在线观看免费| 精品国产一区二区三区久久狼黑人 | 91香蕉视频在线| 国产调教在线观看| 亚洲欧美另类小说视频| 青娱乐国产在线| 精品久久香蕉国产线看观看亚洲 | 二级片在线观看| 亚洲午夜极品| 无码aⅴ精品一区二区三区浪潮| 久久精品午夜| 国产成人在线综合| 丰满放荡岳乱妇91ww| 免费看黄色的视频| 亚洲日本青草视频在线怡红院| 久久在线视频精品| 色婷婷精品久久二区二区蜜臀av| 在线免费观看一区二区| 精品盗摄一区二区三区| 国产污视频在线| 欧美成年人视频| 亚洲高清黄色| 91超碰在线电影| 亚洲婷婷影院| 日本一区二区三区四区五区六区| 亚洲精品少妇| 午夜国产一区二区三区| 丰满白嫩尤物一区二区| 欧洲美熟女乱又伦| 亚洲午夜电影在线| 亚洲一卡二卡在线观看| 欧美r级在线观看| 国产youjizz在线| 欧美激情亚洲一区| 成人在线免费电影网站| 国产欧美日韩一区二区三区| 大胆日韩av| 免费在线激情视频| 国产成都精品91一区二区三| 亚洲自拍偷拍图| 午夜免费久久看| 99久久久无码国产精品免费| 亚洲美女黄色片| 欧美xxxx免费虐| 国产日韩欧美视频在线| 天堂99x99es久久精品免费| 国产欧美自拍视频| 日本视频中文字幕一区二区三区| 精品人妻一区二区三区免费| 欧美国产精品v| 国产一级片毛片| 精品国产99国产精品| 成年人网站在线| 国产裸体写真av一区二区| 日韩黄色网络| 男人日女人视频网站| 国产精品一区二区91| 国产wwwwxxxx| 欧美视频一区二区三区四区| 亚洲色图欧美视频| 欧美精品18videosex性欧美| 国产精品高清一区二区 | 合欧美一区二区三区| 中国黄色片一级| 国产精品美女久久久久av爽李琼| 久久久久久久久久影院| 亚洲精品一区二区三区99| a级网站在线播放| 国产日韩在线亚洲字幕中文| 国产精选一区| www日韩视频| 久久综合给合久久狠狠狠97色69| 国产成人在线播放视频| 精品国产乱码久久久久久蜜臀| 超碰在线免费公开| 成人春色激情网| 888久久久| 欧美国产日韩在线视频| 亚洲男人电影天堂| 99在线小视频| 色综合视频网站| 黄色欧美在线| 内射国产内射夫妻免费频道| 成人精品视频一区| 国产精品一区二区6| 日韩电影网在线| 韩漫成人漫画| 色999日韩自偷自拍美女| 日本在线不卡一区| 亚洲一二三四视频| 欧美福利视频导航| 国产最新在线| 北条麻妃高清一区| 伊人蜜桃色噜噜激情综合| 国产精品伦子伦| 日韩欧美黄色动漫| 搞黄视频在线观看| 成人在线免费观看视视频| 牛牛国产精品| 黄色在线免费播放| 欧美性xxxxxxxxx| av在线资源网| 999国内精品视频在线| 日韩视频二区| 久久亚洲AV无码专区成人国产| 欧美视频在线观看一区二区| 九七久久人人| 国产高清自拍一区| 久久精品五月| 人人澡人人澡人人看| 亚洲国产小视频在线观看| 波多野结衣久久精品| 一区二区三区不卡在线| 国产成人精品免费在线| 久久国产视频播放| 在线成人中文字幕| 亚洲一区二区电影| 草草草在线视频| 一区二区三区在线视频观看| 无码国产精品一区二区免费16| 国产精品96久久久久久又黄又硬| 综合在线一区| 爱爱免费小视频| 欧美一卡二卡在线| 国产日韩电影| 999久久欧美人妻一区二区| 久久影视一区二区| 国产sm主人调教女m视频| 欧美整片在线观看| 影视亚洲一区二区三区| 亚洲成人网在线播放| 欧美一区二区不卡视频| 色香欲www7777综合网| 水蜜桃在线免费观看| 久久久三级国产网站| 亚洲免费国产视频| 国产精品久久久久久久午夜| 伊人久久久大香线蕉综合直播| 亚洲一级理论片| 亚洲欧美综合区自拍另类|