W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
@State裝飾的變量,或稱為狀態(tài)變量,一旦變量擁有了狀態(tài)屬性,就和自定義組件的渲染綁定起來。當(dāng)狀態(tài)改變時(shí),UI會(huì)發(fā)生對(duì)應(yīng)的渲染改變。
在狀態(tài)變量相關(guān)裝飾器中,@State是最基礎(chǔ)的,使變量擁有狀態(tài)屬性的裝飾器,它也是大部分狀態(tài)變量的數(shù)據(jù)源。
從API version 9開始,該裝飾器支持在ArkTS卡片中使用。
@State裝飾的變量,與聲明式范式中的其他被裝飾變量一樣,是私有的,只能從組件內(nèi)部訪問,在聲明時(shí)必須指定其類型和本地初始化。初始化也可選擇使用命名參數(shù)機(jī)制從父組件完成初始化。
@State裝飾的變量擁有以下特點(diǎn):
@State變量裝飾器 | 說明 |
---|---|
裝飾器參數(shù) | 無 |
同步類型 | 不與父組件中任何類型的變量同步。 |
允許裝飾的變量類型 | Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。嵌套類型的場(chǎng)景請(qǐng)參考觀察變化。 類型必須被指定。 不支持any,不支持簡(jiǎn)單類型和復(fù)雜類型的聯(lián)合類型,不允許使用undefined和null。 說明 建議不要裝飾Date類型,應(yīng)用可能會(huì)產(chǎn)生異常行為。 不支持Length、ResourceStr、ResourceColor類型,Length、ResourceStr、ResourceColor為簡(jiǎn)單類型和復(fù)雜類型的聯(lián)合類型。 |
被裝飾變量的初始值 | 必須本地初始化。 |
傳遞/訪問 | 說明 |
---|---|
從父組件初始化 | 可選,從父組件初始化或者本地初始化。如果從父組件初始化將會(huì)覆蓋本地初始化。 支持父組件中常規(guī)變量、@State、@Link、@Prop、@Provide、@Consume、@ObjectLink、@StorageLink、@StorageProp、@LocalStorageLink和@LocalStorageProp裝飾的變量,初始化子組件的@State。 |
用于初始化子組件 | @State裝飾的變量支持初始化子組件的常規(guī)變量、@State、@Link、@Prop、@Provide。 |
是否支持組件外訪問 | 不支持,只能在組件內(nèi)訪問。 |
并不是狀態(tài)變量的所有更改都會(huì)引起UI的刷新,只有可以被框架觀察到的修改才會(huì)引起UI刷新。該小節(jié)去介紹什么樣的修改才能被觀察到,以及觀察到變化后,框架的是怎么引起UI刷新的,即框架的行為表現(xiàn)是什么。
- // for simple type
- @State count: number = 0;
- // value changing can be observed
- this.count = 1;
- class ClassA {
- public value: string;
- constructor(value: string) {
- this.value = value;
- }
- }
- class Model {
- public value: string;
- public name: ClassA;
- constructor(value: string, a: ClassA) {
- this.value = value;
- this.name = a;
- }
- }
@State裝飾的類型是Model
- // class類型
- @State title: Model = new Model('Hello', new ClassA('World'));
對(duì)@State裝飾變量的賦值。
- // class類型賦值
- this.title = new Model('Hi', new ClassA('ArkUI'));
對(duì)@State裝飾變量的屬性賦值。
- // class屬性的賦值
- this.title.value = 'Hi';
嵌套屬性的賦值觀察不到。
- // 嵌套的屬性賦值觀察不到
- this.title.name.value = 'ArkUI';
聲明Model類。
- class Model {
- public value: number;
- constructor(value: number) {
- this.value = value;
- }
- }
@State裝飾的對(duì)象為Model類型數(shù)組時(shí)。
- @State title: Model[] = [new Model(11), new Model(1)];
數(shù)組自身的賦值可以觀察到。
- this.title = [new Model(2)];
數(shù)組項(xiàng)的賦值可以觀察到。
- this.title[0] = new Model(2);
刪除數(shù)組項(xiàng)可以觀察到。
- this.title.pop();
新增數(shù)組項(xiàng)可以觀察到。
- this.title.push(new Model(12));
數(shù)組項(xiàng)中屬性的賦值觀察不到。
- this.title[0].value = 6;
以下示例為@State裝飾的簡(jiǎn)單類型,count被@State裝飾成為狀態(tài)變量,count的改變引起B(yǎng)utton組件的刷新:
- @Entry
- @Component
- struct MyComponent {
- @State count: number = 0;
- build() {
- Button(`click times: ${this.count}`)
- .onClick(() => {
- this.count += 1;
- })
- }
- }
自定義組件MyComponent定義了被@State裝飾的狀態(tài)變量count和title,其中title的類型為自定義類Model。如果count或title的值發(fā)生變化,則查詢MyComponent中使用該狀態(tài)變量的UI組件,并進(jìn)行重新渲染。
EntryComponent中有多個(gè)MyComponent組件實(shí)例,第一個(gè)MyComponent內(nèi)部狀態(tài)的更改不會(huì)影響第二個(gè)MyComponent。
- class Model {
- public value: string;
- constructor(value: string) {
- this.value = value;
- }
- }
- @Entry
- @Component
- struct EntryComponent {
- build() {
- Column() {
- // 此處指定的參數(shù)都將在初始渲染時(shí)覆蓋本地定義的默認(rèn)值,并不是所有的參數(shù)都需要從父組件初始化
- MyComponent({ count: 1, increaseBy: 2 })
- .width(300)
- MyComponent({ title: new Model('Hello World 2'), count: 7 })
- }
- }
- }
- @Component
- struct MyComponent {
- @State title: Model = new Model('Hello World');
- @State count: number = 0;
- private increaseBy: number = 1;
- build() {
- Column() {
- Text(`${this.title.value}`)
- .margin(10)
- Button(`Click to change title`)
- .onClick(() => {
- // @State變量的更新將觸發(fā)上面的Text組件內(nèi)容更新
- this.title.value = this.title.value === 'Hello ArkUI' ? 'Hello World' : 'Hello ArkUI';
- })
- .width(300)
- .margin(10)
- Button(`Click to increase count = ${this.count}`)
- .onClick(() => {
- // @State變量的更新將觸發(fā)該Button組件的內(nèi)容更新
- this.count += this.increaseBy;
- })
- .width(300)
- .margin(10)
- }
- }
- }
從該示例中,我們可以了解到@State變量首次渲染的初始化流程:
- @State title: Model = new Model('Hello World');
- @State count: number = 0;
- MyComponent({ count: 1, increaseBy: 2 })
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)系方式:
更多建議: