成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS基礎(chǔ)之JS UI任意組件通訊

開發(fā) 前端 OpenHarmony
組件間的通信主要作用是能在組件間傳遞數(shù)據(jù)或者執(zhí)行相關(guān)的業(yè)務(wù)邏輯,對于鴻蒙應(yīng)用組件,下面將對幾種組件間的通信方式進行代碼實現(xiàn),其中包括實現(xiàn)自定義實現(xiàn)任意組件通信。

[[423582]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

組件間的通信主要作用是能在組件間傳遞數(shù)據(jù)或者執(zhí)行相關(guān)的業(yè)務(wù)邏輯,對于鴻蒙應(yīng)用組件,下面將對幾種組件間的通信方式進行代碼實現(xiàn),其中包括實現(xiàn)自定義實現(xiàn)任意組件通信。

文件結(jié)構(gòu)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

父子關(guān)系通信

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)
HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

在curren組件中,點擊改變parent按鈕會觸發(fā)changeParent方法,點擊改變child1按鈕會觸發(fā)changeChild1方法,點擊改變child1按鈕會觸發(fā)changeChild1方法,這些方法會改變對應(yīng)組件中的數(shù)據(jù),如下:

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

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

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

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)
HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

current.js中使用this.$emit方法觸發(fā)eventEmit方法:

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

 

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

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

兄弟關(guān)系與跨層級組件間通信

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

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

eventBus

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

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

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

eventBus.js

  1. const Bus = { 
  2.     // 發(fā)布的事件集合 
  3.     $events:{ }, 
  4.   
  5.     /** 
  6.      * 發(fā)布事件方法 
  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.      * 觸發(fā)事件方法 
  33.      * type: string 發(fā)布事件的字符串 
  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 發(fā)布事件時返回的值或者發(fā)布的原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 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

綁定

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

觸發(fā)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

在觸發(fā)方法的時候我們傳入了自定義參數(shù)數(shù)據(jù)"123456789"

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

注銷

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

HarmonyOS 基礎(chǔ)之JS UI任意組件通訊-鴻蒙HarmonyOS技術(shù)社區(qū)

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

總結(jié)

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

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

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

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

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-14 15:14:36

鴻蒙HarmonyOS應(yīng)用

2021-08-24 14:57:27

鴻蒙HarmonyOS應(yīng)用

2021-08-12 15:01:09

鴻蒙HarmonyOS應(yīng)用

2021-09-15 10:19:15

鴻蒙HarmonyOS應(yīng)用

2021-12-10 10:12:44

鴻蒙HarmonyOS應(yīng)用

2021-11-01 10:21:36

鴻蒙HarmonyOS應(yīng)用

2020-11-17 11:48:44

HarmonyOS

2020-11-25 12:02:02

TableLayout

2022-05-20 14:34:20

list組件鴻蒙操作系統(tǒng)

2011-08-01 15:57:58

2011-04-14 10:03:32

UI組件BlackBerry

2011-04-14 10:05:16

BlackBerry

2021-11-24 10:02:53

鴻蒙HarmonyOS應(yīng)用

2012-09-18 09:20:06

2023-10-12 12:43:16

組件Vue

2022-04-24 14:56:53

容器組件StackTS

2022-10-26 15:54:46

canvas組件鴻蒙

2022-10-25 15:12:24

自定義組件鴻蒙

2011-07-06 09:34:19

JAVASCRIPT

2021-10-14 09:53:38

鴻蒙HarmonyOS應(yīng)用
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线免费黄色 | 在线一区视频 | 国产在线观看一区二区三区 | 国产精品欧美一区二区三区 | av一区二区在线观看 | 国产一级电影在线观看 | 欧洲一级黄 | 另类a v| 国产精品福利网 | 国产网站久久 | 久久久久国产一区二区三区 | 久久视频精品在线 | 欧美操操操 | 三级黄视频在线观看 | 欧美欧美欧美 | 视频一区二区在线观看 | 精品国产乱码久久久久久影片 | 中文字幕中文字幕 | 亚洲精品福利视频 | 亚洲一区视频 | 久久久免费 | 中文字幕在线看第二 | 看片天堂| 久久国产精品偷 | 国产亚洲精品久久yy50 | 一区二区三区四区免费在线观看 | 午夜视频免费在线观看 | 国产欧美一区二区精品久导航 | 国产午夜精品一区二区 | 久久久久国产精品午夜一区 | 久久男人 | 欧美黑人又粗大 | 午夜看电影在线观看 | 欧美日韩国产一区二区三区 | 国产亚洲欧美另类一区二区三区 | 瑟瑟视频在线看 | 国产有码 | 国产高清久久久 | 围产精品久久久久久久 | 久久伊人一区二区 | 中文字幕在线视频免费观看 |