W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
@Provide和@Consume,應(yīng)用于與后代組件的雙向數(shù)據(jù)同步,應(yīng)用于狀態(tài)數(shù)據(jù)在多個(gè)層級(jí)之間傳遞的場(chǎng)景。不同于上文提到的父子組件之間通過(guò)命名參數(shù)機(jī)制傳遞,@Provide和@Consume擺脫參數(shù)傳遞機(jī)制的束縛,實(shí)現(xiàn)跨層級(jí)傳遞。
其中@Provide裝飾的變量是在祖先節(jié)點(diǎn)中,可以理解為被“提供”給后代的狀態(tài)變量。@Consume裝飾的變量是在后代組件中,去“消費(fèi)(綁定)”祖先節(jié)點(diǎn)提供的變量。
從API version 9開始,這兩個(gè)裝飾器支持在ArkTS卡片中使用。
@Provide/@Consume裝飾的狀態(tài)變量有以下特性:
- // 通過(guò)相同的變量名綁定
- @Provide a: number = 0;
- @Consume a: number;
- // 通過(guò)相同的變量別名綁定
- @Provide('a') b: number = 0;
- @Consume('a') c: number;
@Provide和@Consume通過(guò)相同的變量名或者相同的變量別名綁定時(shí),@Provide修飾的變量和@Consume修飾的變量是一對(duì)多的關(guān)系。不允許在同一個(gè)自定義組件內(nèi),包括其子組件中聲明多個(gè)同名或者同別名的@Provide裝飾的變量。
@State的規(guī)則同樣適用于@Provide,差異為@Provide還作為多層后代的同步源。
@Provide變量裝飾器 | 說(shuō)明 |
---|---|
裝飾器參數(shù) | 別名:常量字符串,可選。 如果指定了別名,則通過(guò)別名來(lái)綁定變量;如果未指定別名,則通過(guò)變量名綁定變量。 |
同步類型 | 雙向同步。 從@Provide變量到所有@Consume變量以及相反的方向的數(shù)據(jù)同步。雙向同步的操作與@State和@Link的組合相同。 |
允許裝飾的變量類型 | Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。嵌套類型的場(chǎng)景請(qǐng)參考觀察變化。 不支持any,不支持簡(jiǎn)單類型和復(fù)雜類型的聯(lián)合類型,不允許使用undefined和null。 必須指定類型。@Provide變量的@Consume變量的類型必須相同。 說(shuō)明 不支持Length、ResourceStr、ResourceColor類型,Length、ResourceStr、ResourceColor為簡(jiǎn)單類型和復(fù)雜類型的聯(lián)合類型。 |
被裝飾變量的初始值 | 必須指定。 |
@Consume變量裝飾器 | 說(shuō)明 |
---|---|
裝飾器參數(shù) | 別名:常量字符串,可選。 如果提供了別名,則必須有@Provide的變量和其有相同的別名才可以匹配成功;否則,則需要變量名相同才能匹配成功。 |
同步類型 | 雙向:從@Provide變量(具體請(qǐng)參見@Provide)到所有@Consume變量,以及相反的方向。雙向同步操作與@State和@Link的組合相同。 |
允許裝飾的變量類型 | Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。嵌套類型的場(chǎng)景請(qǐng)參考觀察變化。 不支持any,不允許使用undefined和null。 必須指定類型。@Provide變量的@Consume變量的類型必須相同。 說(shuō)明
|
被裝飾變量的初始值 | 無(wú),禁止本地初始化。 |
@Provide傳遞/訪問(wèn) | 說(shuō)明 |
---|---|
從父組件初始化和更新 | 可選,允許父組件中常規(guī)變量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp裝飾的變量裝飾變量初始化子組件@Provide。 |
用于初始化子組件 | 允許,可用于初始化@State、@Link、@Prop、@Provide。 |
和父組件同步 | 否。 |
和后代組件同步 | 和@Consume雙向同步。 |
是否支持組件外訪問(wèn) | 私有,僅可以在所屬組件內(nèi)訪問(wèn)。 |
@Consume傳遞/訪問(wèn) | 說(shuō)明 |
---|---|
從父組件初始化和更新 | 禁止。通過(guò)相同的變量名和alias(別名)從@Provide初始化。 |
用于初始化子組件 | 允許,可用于初始化@State、@Link、@Prop、@Provide。 |
和祖先組件同步 | 和@Provide雙向同步。 |
是否支持組件外訪問(wèn) | 私有,僅可以在所屬組件內(nèi)訪問(wèn) |
在下面的示例是與后代組件雙向同步狀態(tài)@Provide和@Consume場(chǎng)景。當(dāng)分別點(diǎn)擊CompA和CompD組件內(nèi)Button時(shí),reviewVotes 的更改會(huì)雙向同步在CompA和CompD中。
- @Component
- struct CompD {
- // @Consume裝飾的變量通過(guò)相同的屬性名綁定其祖先組件CompA內(nèi)的@Provide裝飾的變量
- @Consume reviewVotes: number;
- build() {
- Column() {
- Text(`reviewVotes(${this.reviewVotes})`)
- Button(`reviewVotes(${this.reviewVotes}), give +1`)
- .onClick(() => this.reviewVotes += 1)
- }
- .width('50%')
- }
- }
- @Component
- struct CompC {
- build() {
- Row({ space: 5 }) {
- CompD()
- CompD()
- }
- }
- }
- @Component
- struct CompB {
- build() {
- CompC()
- }
- }
- @Entry
- @Component
- struct CompA {
- // @Provide裝飾的變量reviewVotes由入口組件CompA提供其后代組件
- @Provide reviewVotes: number = 0;
- build() {
- Column() {
- Button(`reviewVotes(${this.reviewVotes}), give +1`)
- .onClick(() => this.reviewVotes += 1)
- CompB()
- }
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: