在聲明式UI編程框架中,UI是程序狀態(tài)的運行結(jié)果刘绣,最重要的就是狀態(tài)管理機制樱溉。
基本概念
- 狀態(tài)變量:被狀態(tài)裝飾器裝飾的變量,狀態(tài)變量值的改變會引起UI的渲染更新纬凤。示例:@State num: number = 1,其中福贞,@State是狀態(tài)裝飾器,num是狀態(tài)變量停士。
- 常規(guī)變量:不會引起UI的刷新挖帘。
- 數(shù)據(jù)源/同步源:狀態(tài)變量的原始來源,可以同步給不同的狀態(tài)數(shù)據(jù)恋技。通常意義為父組件傳給子組件的數(shù)據(jù)拇舀。
- 命名參數(shù)機制:父組件通過指定參數(shù)傳遞給子組件的狀態(tài)變量,為父子傳遞同步參數(shù)的主要手段蜻底。示例:CompA: ({ aProp: this.aProp })骄崩。
- 從父組件初始化:父組件使用命名參數(shù)機制,將指定參數(shù)傳遞給子組件薄辅。子組件初始化的默認(rèn)值在有父組件傳值的情況下要拂,會被覆蓋。
- 初始化子節(jié)點:父組件中狀態(tài)變量可以傳遞給子組件长搀,初始化子組件對應(yīng)的狀態(tài)變量宇弛。
- 本地初始化:在變量聲明的時候賦值,作為變量的默認(rèn)值源请。示例:@State count: number = 0枪芒。
裝飾器總覽
ArkUI提供了多種裝飾器,通過使用這些裝飾器谁尸,狀態(tài)變量不僅可以觀察在組件內(nèi)的改變舅踪,還可以在不同組件層級間傳遞,比如父子組件良蛮、跨組件層級抽碌,也可以觀察全局范圍內(nèi)的變化。根據(jù)狀態(tài)變量的影響范圍,將所有的裝飾器可以大致分為:
管理組件擁有狀態(tài)的裝飾器:組件級別的狀態(tài)管理货徙,可以觀察組件內(nèi)變化左权,和不同組件層級的變化,但需要唯一觀察同一個組件樹上痴颊,即同一個頁面內(nèi)赏迟。
管理應(yīng)用擁有狀態(tài)的裝飾器:應(yīng)用級別的狀態(tài)管理,可以觀察不同頁面蠢棱,甚至不同UIAbility的狀態(tài)變化锌杀,是應(yīng)用內(nèi)全局的狀態(tài)管理。
從數(shù)據(jù)的傳遞形式和同步類型層面看泻仙,裝飾器也可分為:只讀的單向傳遞糕再;
可變更的雙向傳遞。
圖示如下玉转,具體裝飾器的介紹突想,可詳見管理組件擁有的狀態(tài)和管理應(yīng)用擁有的狀態(tài)。開發(fā)者可以靈活地利用這些能力來實現(xiàn)數(shù)據(jù)和UI的聯(lián)動究抓。
上圖中蒿柳,Components部分的裝飾器為組件級別的狀態(tài)管理,Application部分為應(yīng)用的狀態(tài)管理漩蟆。開發(fā)者可以通過@StorageLink/@LocalStorageLink實現(xiàn)應(yīng)用和組件狀態(tài)的雙向同步,通過@StorageProp/@LocalStorageProp實現(xiàn)應(yīng)用和組件狀態(tài)的單向同步妓蛮。
管理組件擁有的狀態(tài)怠李,即圖中Components級別的狀態(tài)管理:
- @State:@State裝飾的變量擁有其所屬組件的狀態(tài),可以作為其子組件單向和雙向同步的數(shù)據(jù)源蛤克。當(dāng)其數(shù)值改變時捺癞,會引起相關(guān)組件的渲染刷新。
- @Prop:@Prop裝飾的變量可以和父組件建立單向同步關(guān)系构挤,@Prop裝飾的變量是可變的髓介,但修改不會同步回父組件。
- @Link:@Link裝飾的變量和父組件構(gòu)建雙向同步關(guān)系的狀態(tài)變量筋现,父組件會接受來自@Link裝飾的變量的修改的同步唐础,父組件的更新也會同步給@Link裝飾的變量
- @Provide/@Consume:@Provide/@Consume裝飾的變量用于跨組件層級(多層組件)同步狀態(tài)變量,可以不需要通過參數(shù)命名機制傳遞矾飞,通過alias(別名)或者屬性名綁定一膨。
- @Observed:@Observed裝飾class,需要觀察多層嵌套場景的class需要被@Observed裝飾洒沦。單獨使用@Observed沒有任何作用豹绪,需要和@ObjectLink、@Prop連用申眼。
- @ObjectLink:@ObjectLink裝飾的變量接收@Observed裝飾的class的實例瞒津,應(yīng)用于觀察多層嵌套場景蝉衣,和父組件的數(shù)據(jù)源構(gòu)建雙向同步。
注意:僅@Observed/@ObjectLink可以觀察嵌套場景巷蚪,其他的狀態(tài)變量僅能觀察第一層病毡,詳情見各個裝飾器章節(jié)的“觀察變化和行為表現(xiàn)”小節(jié)。
管理應(yīng)用擁有的狀態(tài)钓辆,即圖中Application級別的狀態(tài)管理:
- AppStorage是應(yīng)用程序中的一個特殊的單例LocalStorage對象剪验,是應(yīng)用級的數(shù)據(jù)庫,和進(jìn)程綁定前联,通過@StorageProp和@StorageLink裝飾器可以和組件聯(lián)動功戚。
- AppStorage是應(yīng)用狀態(tài)的“中樞”,將需要與組件(UI)交互的數(shù)據(jù)存入AppStorage似嗤,比如持久化數(shù)據(jù)PersistentStorage和環(huán)境變量Environment啸臀。UI再通過AppStorage提供的裝飾器或者API接口,訪問這些數(shù)據(jù)烁落。
- 框架還提供了LocalStorage乘粒,AppStorage是LocalStorage特殊的單例。LocalStorage是應(yīng)用程序聲明的應(yīng)用狀態(tài)的內(nèi)存“數(shù)據(jù)庫”伤塌,通常用于頁面級的狀態(tài)共享灯萍,通過@LocalStorageProp和@LocalStorageLink裝飾器可以和UI聯(lián)動。
其他狀態(tài)管理功能
- @Watch用于監(jiān)聽狀態(tài)變量的變化每聪。
- $$運算符:給內(nèi)置組件提供TS變量的引用旦棉,使得TS變量和內(nèi)置組件的內(nèi)部狀態(tài)保持同步。