W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
@Prop裝飾的變量可以和父組件建立單向的同步關(guān)系。@Prop裝飾的變量是可變的,但是變化不會同步回其父組件。
從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
@Prop裝飾的變量和父組件建立單向的同步關(guān)系:
@Prop變量裝飾器 | 說明 |
---|---|
裝飾器參數(shù) | 無 |
同步類型 | 單向同步:對父組件狀態(tài)變量值的修改,將同步給子組件@Prop裝飾的變量,子組件@Prop變量的修改不會同步到父組件的狀態(tài)變量上 |
允許裝飾的變量類型 | string、number、boolean、enum類型。 不支持any,不允許使用undefined和null。 必須指定類型。 在父組件中,傳遞給@Prop裝飾的值不能為undefined或者null,反例如下所示。 CompA ({ aProp: undefined }) CompA ({ aProp: null }) @Prop和數(shù)據(jù)源類型需要相同,有以下三種情況(數(shù)據(jù)源以@State為例):
|
被裝飾變量的初始值 | 允許本地初始化。 |
傳遞/訪問 | 說明 |
---|---|
從父組件初始化 | 如果本地有初始化,則是可選的。沒有的話,則必選,支持父組件中的常規(guī)變量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp去初始化子組件中的@Prop變量。 |
用于初始化子組件 | @Prop支持去初始化子組件中的常規(guī)變量、@State、@Link、@Prop、@Provide。 |
是否支持組件外訪問 | @Prop裝飾的變量是私有的,只能在組件內(nèi)訪問。 |
@Prop裝飾的數(shù)據(jù)可以觀察到以下變化。
- // 簡單類型
- @Prop count: number;
- // 賦值的變化可以被觀察到
- this.count = 1;
對于@State和@Prop的同步場景:
要理解@Prop變量值初始化和更新機(jī)制,有必要了解父組件和擁有@Prop變量的子組件初始渲染和更新流程。
以下示例是@State到子組件@Prop簡單數(shù)據(jù)同步,父組件ParentComponent的狀態(tài)變量countDownStartValue初始化子組件CountDownComponent中@Prop裝飾的count,點(diǎn)擊“Try again”,count的修改僅保留在CountDownComponent,不會同步給父組件ParentComponent。
ParentComponent的狀態(tài)變量countDownStartValue的變化將重置CountDownComponent的count。
- @Component
- struct CountDownComponent {
- @Prop count: number;
- costOfOneAttempt: number = 1;
- build() {
- Column() {
- if (this.count > 0) {
- Text(`You have ${this.count} Nuggets left`)
- } else {
- Text('Game over!')
- }
- // @Prop裝飾的變量不會同步給父組件
- Button(`Try again`).onClick(() => {
- this.count -= this.costOfOneAttempt;
- })
- }
- }
- }
- @Entry
- @Component
- struct ParentComponent {
- @State countDownStartValue: number = 10;
- build() {
- Column() {
- Text(`Grant ${this.countDownStartValue} nuggets to play.`)
- // 父組件的數(shù)據(jù)源的修改會同步給子組件
- Button(`+1 - Nuggets in New Game`).onClick(() => {
- this.countDownStartValue += 1;
- })
- // 父組件的修改會同步給子組件
- Button(`-1 - Nuggets in New Game`).onClick(() => {
- this.countDownStartValue -= 1;
- })
- CountDownComponent({ count: this.countDownStartValue, costOfOneAttempt: 2 })
- }
- }
- }
在上面的示例中:
父組件中@State如果裝飾的數(shù)組,其數(shù)組項(xiàng)也可以初始化@Prop。以下示例中父組件Index中@State裝飾的數(shù)組arr,將其數(shù)組項(xiàng)初始化子組件Child中@Prop裝飾的value。
- @Component
- struct Child {
- @Prop value: number;
- build() {
- Text(`${this.value}`)
- .fontSize(50)
- .onClick(()=>{this.value++})
- }
- }
- @Entry
- @Component
- struct Index {
- @State arr: number[] = [1,2,3];
- build() {
- Row() {
- Column() {
- Child({value: this.arr[0]})
- Child({value: this.arr[1]})
- Child({value: this.arr[2]})
- Divider().height(5)
- ForEach(this.arr,
- item => {
- Child({'value': item} as Record<string, number>)
- },
- item => item.toString()
- )
- Text('replace entire arr')
- .fontSize(50)
- .onClick(()=>{
- // 兩個(gè)數(shù)組都包含項(xiàng)“3”。
- this.arr = this.arr[0] == 1 ? [3,4,5] : [1,2,3];
- })
- }
- }
- }
- }
初始渲染創(chuàng)建6個(gè)子組件實(shí)例,每個(gè)@Prop裝飾的變量初始化都在本地拷貝了一份數(shù)組項(xiàng)。子組件onclick事件處理程序會更改局部變量值。
如果點(diǎn)擊界面上的“1”六次、“2”五次、“3”四次,將所有變量的本地取值都變?yōu)椤?”。
- 7
- 7
- 7
- ----
- 7
- 7
- 7
單擊replace entire arr后,屏幕將顯示以下信息,為什么?
- 3
- 4
- 5
- ----
- 7
- 4
- 5
如果圖書館有一本圖書和兩位用戶,每位用戶都可以將圖書標(biāo)記為已讀,此標(biāo)記行為不會影響其它讀者用戶。從代碼角度講,對@Prop圖書對象的本地更改不會同步給圖書館組件中的@State圖書對象。
- class Book {
- public title: string;
- public pages: number;
- public readIt: boolean = false;
- constructor(title: string, pages: number) {
- this.title = title;
- this.pages = pages;
- }
- }
- @Component
- struct ReaderComp {
- @Prop title: string;
- @Prop readIt: boolean;
- build() {
- Row() {
- Text(this.title)
- Text(`... ${this.readIt ? 'I have read' : 'I have not read it'}`)
- .onClick(() => this.readIt = true)
- }
- }
- }
- @Entry
- @Component
- struct Library {
- @State book: Book = new Book('100 secrets of C++', 765);
- build() {
- Column() {
- ReaderComp({ title: this.book.title, readIt: this.book.readIt })
- ReaderComp({ title: this.book.title, readIt: this.book.readIt })
- }
- }
- }
為了支持@Component裝飾的組件復(fù)用場景,@Prop支持本地初始化,這樣可以讓@Prop是否與父組件建立同步關(guān)系變得可選。當(dāng)且僅當(dāng)@Prop有本地初始化時(shí),從父組件向子組件傳遞@Prop的數(shù)據(jù)源才是可選的。
下面的示例中,子組件包含兩個(gè)@Prop變量:
- @Component
- struct MyComponent {
- @Prop customCounter: number;
- @Prop customCounter2: number = 5;
- build() {
- Column() {
- Row() {
- Text(`From Main: ${this.customCounter}`).fontColor('#ff6b6565').margin({ left: -110, top: 12 })
- }
- Row() {
- Button('Click to change locally !')
- .width(288)
- .height(40)
- .margin({ left: 30, top: 12 })
- .fontColor('#FFFFFF,90%')
- .onClick(() => {
- this.customCounter2++
- })
- }
- Row() {
- Text(`Custom Local: ${this.customCounter2}`).fontColor('#ff6b6565').margin({ left: -110, top: 12 })
- }
- }
- }
- }
- @Entry
- @Component
- struct MainProgram {
- @State mainCounter: number = 10;
- build() {
- Column() {
- Row() {
- Column() {
- // customCounter必須從父組件初始化,因?yàn)镸yComponent的customCounter成員變量缺少本地初始化;此處,customCounter2可以不做初始化。
- MyComponent({ customCounter: this.mainCounter })
- // customCounter2也可以從父組件初始化,父組件初始化的值會覆蓋子組件customCounter2的本地初始化的值
- MyComponent({ customCounter: this.mainCounter, customCounter2: this.mainCounter })
- }
- }
- Row() {
- Column() {
- Button('Click to change number')
- .width(288)
- .height(40)
- .margin({ left: 30, top: 12 })
- .fontColor('#FFFFFF,90%')
- .onClick(() => {
- this.mainCounter++
- })
- }
- }
- }
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: