国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解

這篇具有很好參考價(jià)值的文章主要介紹了鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

今天是1月11日號星期四,農(nóng)歷臘月初一,辭舊的歲月里,愿你守得云開、終見月明,迎新的時(shí)光中,愿你心御寒冬、順?biāo)鞜o憂,歲末冬深,希望接下來的日子里足夠幸運(yùn),攢足勇氣、信心和運(yùn)氣,去迎接新的一年,去遇見更好的自己!

目錄

一,定義

二,特性

三,裝飾器說明

?四,變量的傳遞/訪問規(guī)則說明

五,使用

1,簡單使用

?2,裝飾對象

3,裝飾Array

一,定義

@Provide和@Consume,應(yīng)用于與后代組件的雙向數(shù)據(jù)同步,應(yīng)用于狀態(tài)數(shù)據(jù)在多個(gè)層級之間傳遞的場景。不同于其他父子組件之間通過命名參數(shù)機(jī)制傳遞,@Provide和@Consume擺脫參數(shù)傳遞機(jī)制的束縛,實(shí)現(xiàn)跨層級傳遞。

其中@Provide裝飾的變量是在祖先組件中,可以理解為被“提供”給后代的狀態(tài)變量。@Consume裝飾的變量是在后代組件中,去“消費(fèi)(綁定)”祖先組件提供的變量。

二,特性

@Provide/@Consume裝飾的狀態(tài)變量有以下特性:

①@Provide裝飾的狀態(tài)變量自動(dòng)對其所有后代組件可用,即該變量被“provide”給他的后代組件。由此可見,@Provide的方便之處在于,開發(fā)者不需要多次在組件之間傳遞變量。

②后代通過使用@Consume去獲取@Provide提供的變量,建立在@Provide和@Consume之間的雙向數(shù)據(jù)同步,與@State/@Link不同的是,前者可以在多層級的父子組件之間傳遞。

③@Provide和@Consume可以通過相同的變量名或者相同的變量別名綁定,建議類型相同,否則會發(fā)生類型隱式轉(zhuǎn)換,從而導(dǎo)致應(yīng)用行為異常。

@Provide和@Consume通過相同的變量名或者相同的變量別名綁定時(shí),@Provide修飾的變量和@Consume修飾的變量是一對多的關(guān)系。不允許在同一個(gè)自定義組件內(nèi),包括其子組件中聲明多個(gè)同名或者同別名的@Provide裝飾的變量,@Provide的屬性名或別名需要唯一且確定,如果聲明多個(gè)同名或者同別名的@Provide裝飾的變量,會發(fā)生運(yùn)行時(shí)報(bào)錯(cuò)。

三,裝飾器說明

@State的規(guī)則同樣適用于@Provide,差異為@Provide還作為多層后代的同步源。

@Provide變量裝飾器 說明
裝飾器參數(shù) 別名:常量字符串,可選。
如果指定了別名,則通過別名來綁定變量;如果未指定別名,則通過變量名綁定變量。
同步類型 雙向同步。
從@Provide變量到所有@Consume變量以及相反的方向的數(shù)據(jù)同步。雙向同步的操作與@State和@Link的組合相同。
允許裝飾的變量類型 Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。
支持Date類型。
不支持any,不支持簡單類型和復(fù)雜類型的聯(lián)合類型,不允許使用undefined和null。
必須指定類型。@Provide變量的@Consume變量的類型必須相同。
說明:
不支持Length、ResourceStr、ResourceColor類型,Length、ResourceStr、ResourceColor為簡單類型和復(fù)雜類型的聯(lián)合類型。
被裝飾變量的初始值 必須指定。
@Consume變量裝飾器 說明
裝飾器參數(shù) 別名:常量字符串,可選。
如果提供了別名,則必須有@Provide的變量和其有相同的別名才可以匹配成功;否則,則需要變量名相同才能匹配成功。
同步類型 雙向:從@Provide變量(具體請參見@Provide)到所有@Consume變量,以及相反的方向。雙向同步操作與@State和@Link的組合相同。
允許裝飾的變量類型 Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。
支持Date類型。
不支持any,不允許使用undefined和null。
必須指定類型。@Provide變量和@Consume變量的類型必須相同。
說明:
@Consume裝飾的變量,在其父節(jié)點(diǎn)或者祖先節(jié)點(diǎn)上,必須有對應(yīng)的屬性和別名的@Provide裝飾的變量。
被裝飾變量的初始值 無,禁止本地初始化。

?四,變量的傳遞/訪問規(guī)則說明

@Provide傳遞/訪問 說明
從父組件初始化和更新 可選,允許父組件中常規(guī)變量(常規(guī)變量對@Prop賦值,只是數(shù)值的初始化,常規(guī)變量的變化不會觸發(fā)UI刷新,只有狀態(tài)變量才能觸發(fā)UI刷新)、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp裝飾的變量裝飾變量初始化子組件@Provide。
用于初始化子組件 允許,可用于初始化@State、@Link、@Prop、@Provide。
和父組件同步 否。
和后代組件同步 和@Consume雙向同步。
是否支持組件外訪問 私有,僅可以在所屬組件內(nèi)訪問。
@Consume傳遞/訪問 說明
從父組件初始化和更新 禁止。通過相同的變量名和alias(別名)從@Provide初始化。
用于初始化子組件 允許,可用于初始化@State、@Link、@Prop、@Provide。
和祖先組件同步 和@Provide雙向同步。
是否支持組件外訪問 私有,僅可以在所屬組件內(nèi)訪問

五,使用

1,簡單使用

?子組件:

@Component
export default struct ProvideTest {
  @Consume name:string

  build() {
    Row() {
      Column() {
        Text("子name:"+ this.name)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.name="袁震2"
          })
      }.width('100%')
    }.height('100%')
  }
}

?父組件:

import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {

  @Provide name:string ="袁震"

  build() {
    Column(){
      Text("父name:"+this.name)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.name ="袁震1"
        })
      ProvideTest()
    }
  }
}

運(yùn)行結(jié)果:

鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊父name鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊子name鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos

?所以,當(dāng)裝飾的數(shù)據(jù)類型為boolean、string、number類型時(shí),可以觀察到數(shù)值的變化。

?2,裝飾對象

數(shù)據(jù)類:

export default class YuanZhen {

  public name: string = 'YuanZhen';

  public age: number = 18;

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}
import YuanZhen from './YuanZhen';

export default class Yuan {

  public number: number = 1;
  public yuanZhen: YuanZhen = new YuanZhen('yuanzhen', 18);

  constructor(number: number, yuanZhen: YuanZhen) {
    this.number = number
    this.yuanZhen = yuanZhen
  }
}

?子組件:

import Yuan from './bean/Yuan'

@Component
export default struct ProvideTest {
  @Consume yuan:Yuan

  build() {
    Row() {
      Column() {
        Text("子name:" + this.yuan.yuanZhen.name+"\nage:"+this.yuan.yuanZhen.age+"\nnumber:"+this.yuan.number)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuan.number=26
            this.yuan.yuanZhen.age=30
            this.yuan.yuanZhen.name="袁世震"
          })
      }.width('100%')
    }.height('100%')
  }
}

父組件:

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {
  @Provide yuan:Yuan=new Yuan(2,new YuanZhen("袁震",18))

  build() {
    Column(){
      Text("父name:" + this.yuan.yuanZhen.name+"\nage:"+this.yuan.yuanZhen.age+"\nnumber:"+this.yuan.number)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan.number=1
          this.yuan.yuanZhen.age=32
          this.yuan.yuanZhen.name="袁震1"
        })
      ProvideTest()
    }
  }
}

運(yùn)行效果:

鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊父name鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊子name鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos

所以,當(dāng)裝飾的數(shù)據(jù)類型為class或者Object的時(shí)候,可以觀察到賦值和屬性賦值的變化(屬性為Object.keys(observedObject)返回的所有屬性)。

3,裝飾Array

子組件:

import Yuan from './bean/Yuan'

@Component
export default struct ProvideTest {
  @Consume yuan:Array<Yuan>

  build() {
    Row() {
      Column() {
        Text("子size:" + this.yuan.length+"\nage:"+this.yuan[0].yuanZhen.age+"\nnumber:"+this.yuan[0].number)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuan[0].number =20
            this.yuan[0].yuanZhen.age=35
            this.yuan.pop()
          })
      }.width('100%')
    }.height('100%')
  }
}

?父組件:

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {
  @Provide yuan:Array<Yuan>=new Array

  aboutToAppear(){
    let yuan1:Yuan =new Yuan(1,new YuanZhen("袁震1",18))
    let yuan2:Yuan =new Yuan(2,new YuanZhen("袁震2",19))
    let yuan3:Yuan =new Yuan(3,new YuanZhen("袁震3",20))
    this.yuan.push(yuan1)
    this.yuan.push(yuan2)
    this.yuan.push(yuan3)
  }

  build() {
    Column(){
      Text("父size:" + this.yuan.length+"\nage:"+this.yuan[0].yuanZhen.age+"\nnumber:"+this.yuan[0].number)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan[0].number =10
          this.yuan[0].yuanZhen.age=30
          this.yuan.pop()
        })
      ProvideTest()
    }
  }
}

?運(yùn)行:

鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊父鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos點(diǎn)擊子鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解,鴻蒙開發(fā),鴻蒙,harmonyos

由此可見,?當(dāng)裝飾的對象是array的時(shí)候,可以觀察到數(shù)組的添加、刪除、更新數(shù)組單元

!注意:更新原理

  1. 初始渲染:

    1. @Provide裝飾的變量會以map的形式,傳遞給當(dāng)前@Provide所屬組件的所有子組件;
    2. 子組件中如果使用@Consume變量,則會在map中查找是否有該變量名/alias(別名)對應(yīng)的@Provide的變量,如果查找不到,框架會拋出JS ERROR;
    3. 在初始化@Consume變量時(shí),和@State/@Link的流程類似,@Consume變量會保存在map中查找到的@Provide變量,并把自己注冊給@Provide。
  2. 當(dāng)@Provide裝飾的數(shù)據(jù)變化時(shí):

    1. 通過初始渲染的步驟可知,子組件@Consume已把自己注冊給父組件。父組件@Provide變量變更后,會遍歷更新所有依賴它的系統(tǒng)組件(elementid)和狀態(tài)變量(@Consume);
    2. 通知@Consume更新后,子組件所有依賴@Consume的系統(tǒng)組件(elementId)都會被通知更新。以此實(shí)現(xiàn)@Provide對@Consume狀態(tài)數(shù)據(jù)同步。
  3. 當(dāng)@Consume裝飾的數(shù)據(jù)變化時(shí):

    通過初始渲染的步驟可知,子組件@Consume持有@Provide的實(shí)例。在@Consume更新后調(diào)用@Provide的更新方法,將更新的數(shù)值同步回@Provide,以此實(shí)現(xiàn)@Consume向@Provide的同步更新。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-790100.html

?

到了這里,關(guān)于鴻蒙Harmony--狀態(tài)管理器--@Provide裝飾器和@Consume裝飾器詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 鴻蒙Harmony--AppStorage--應(yīng)用全局的UI狀態(tài)存儲詳解

    鴻蒙Harmony--AppStorage--應(yīng)用全局的UI狀態(tài)存儲詳解

    ?無所求必滿載而歸,當(dāng)你降低期待,降低欲望,往往會得到比較好的結(jié)果,把行動(dòng)交給現(xiàn)在,用心甘情愿的態(tài)度,過隨遇而安的生活,無論結(jié)果如何,都是一場驚喜的獲得! 目錄 一,定義 二,@StorageProp定義 三,@StorageProp裝飾器使用規(guī)則說明 四,變量的傳遞/訪問規(guī)則說明

    2024年01月17日
    瀏覽(19)
  • 鴻蒙Harmony-PersistentStorage--持久化存儲UI狀態(tài)儲詳解

    鴻蒙Harmony-PersistentStorage--持久化存儲UI狀態(tài)儲詳解

    用簡單的心境,對待復(fù)雜的人生,方能看淡得失,從容入世,瀟灑自如,心變得簡單了,世界也就簡單了 目錄 一,定義 二,限制條件 三,使用 LocalStorage和AppStorage都是運(yùn)行時(shí)的內(nèi)存,但是在應(yīng)用退出再次啟動(dòng)后,依然能保存選定的結(jié)果,是應(yīng)用開發(fā)中十分常見的現(xiàn)象,這就

    2024年01月18日
    瀏覽(18)
  • 鴻蒙:Harmony開發(fā)基礎(chǔ)知識詳解

    鴻蒙:Harmony開發(fā)基礎(chǔ)知識詳解

    工欲善其事,必先利其器。 上一篇博文實(shí)現(xiàn)了一個(gè) \\\"Hello Harmony\\\" 的Demo,今天這篇博文就以 \\\"Hello Harmony\\\"? 為例,以官網(wǎng)開發(fā)文檔為依據(jù),從鴻蒙開發(fā)主要的幾個(gè)方面入手,詳細(xì)了解一下鴻蒙開發(fā)所需的基礎(chǔ)知識。 HarmonyOS提供了一套UI開發(fā)框架,即 方舟開發(fā)框架 ( ArkUI框架 )

    2024年02月05日
    瀏覽(65)
  • 鴻蒙Harmony-頁面路由(router)詳解

    鴻蒙Harmony-頁面路由(router)詳解

    慢慢理解世界,慢慢更新自己,希望你的每一個(gè)昨天,今天,和明天都會很快樂,你知道的,先好起來的從來都不是生活,而是你自己? 目錄 一,定義 二,頁面跳轉(zhuǎn) 2.1使用router.pushUrl 2.2 使用router.replaceUrl 2.3 使用Single模式 2.4 帶參數(shù)的跳轉(zhuǎn) ?三,頁面返回 ?3.1返回到上一個(gè)頁

    2024年01月20日
    瀏覽(25)
  • 鴻蒙Harmony-相對布局(RelativeContainer)詳解

    鴻蒙Harmony-相對布局(RelativeContainer)詳解

    成年人的世界,從來沒有容易二字,想要什么,就得憑自己的努力去拿,遇到事情就得自己生生的硬抗,希望你即使再辛苦,但還是會選擇這滾燙的人生,加油陌生的朋友們 目錄 一,定義 二,設(shè)置依賴關(guān)系 2.1?錨點(diǎn)設(shè)置 2.2?設(shè)置相對于錨點(diǎn)的對齊位置 RelativeContainer為采用相

    2024年02月01日
    瀏覽(28)
  • 鴻蒙Harmony-層疊布局(Stack)詳解

    鴻蒙Harmony-層疊布局(Stack)詳解

    我們總是為了太多遙不可及的東西去拼命,卻忘了人生真正的幸福不過是燈火闌珊處的溫暖,柴米油鹽的充實(shí),人生無論你賺的錢,是多還是少,經(jīng)歷的事情是好還是壞,都不如過好當(dāng)下的每一天!? 目錄 一,定義 二,開發(fā)布局 三,對齊方式 3.1?TopStart頂部起始端? 3.2?To

    2024年01月18日
    瀏覽(20)
  • 鴻蒙Harmony-列表組件(List)詳解

    鴻蒙Harmony-列表組件(List)詳解

    不要和別人比生活,每個(gè)人階段不同,追求不同,活法自然也不同。只要今天的你能比昨天的你快樂一點(diǎn)點(diǎn),那你就是自己人生贏家。 目錄 一,定義 二,布局與約束 2.1 布局 2.2 約束 三,開發(fā)布局 3.1?設(shè)置主軸方向 3.2設(shè)置交叉軸布局 四,迭代列表內(nèi)容 五,自定義列表樣式

    2024年01月17日
    瀏覽(20)
  • 鴻蒙harmony--數(shù)據(jù)庫sqlite詳解

    鴻蒙harmony--數(shù)據(jù)庫sqlite詳解

    今天是1月20號星期六,早安,歲末大寒至,靜后春歸來。愿他鄉(xiāng)故人,漂泊有歸宿,前程有奔赴,愿人間不寒,溫暖常伴,諸事順利,喜樂長安。? 目錄 一,定義 二,運(yùn)作機(jī)制 三,約束限制 四,接口說明 五,開發(fā)步驟 5.1 獲取數(shù)據(jù)庫 5.2 創(chuàng)建數(shù)據(jù)庫表 5.3 數(shù)據(jù)庫升降級 5.4插

    2024年01月21日
    瀏覽(19)
  • 鴻蒙Harmony-線性布局(Row/Column)詳解

    鴻蒙Harmony-線性布局(Row/Column)詳解

    人生的下半場,做個(gè)簡單的人,少與人糾纏,多看大自然,在路上見世界,在途中尋自己。往后余生唯愿開心健康,至于其他,隨緣就好!? 目錄 一,定義 二,基本概念 三,布局子元素在排列方向上的間距 四,布局子元素在交叉軸上的對齊方式 4.1 Column容器內(nèi)子元素在水平

    2024年02月01日
    瀏覽(26)
  • 系統(tǒng)學(xué)習(xí)Python——裝飾器:類裝飾器-[初探類裝飾器和元類]

    分類目錄:《系統(tǒng)學(xué)習(xí)Python》總目錄 函數(shù)裝飾器是如此有用,以至于Python2.X和Python3.X都擴(kuò)展了這一模式,允許裝飾器應(yīng)用于類和函數(shù)。簡而言之,類裝飾器類似于函數(shù)裝飾器,但它們是在一條 class 語句的末尾運(yùn)行,并把一個(gè)類名重新綁定到一個(gè)可調(diào)用對象。同樣,它們可以

    2024年02月19日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包