狀態(tài)管理概述

在聲明式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)動究抓。

image.png

上圖中蒿柳,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)保持同步。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末药薯,一起剝皮案震驚了整個濱河市绑洛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌童本,老刑警劉巖真屯,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穷娱,居然都是意外死亡绑蔫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門鄙煤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晾匠,“玉大人,你說我怎么就攤上這事梯刚×构荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長澜共。 經(jīng)常有香客問我向叉,道長,這世上最難降的妖魔是什么嗦董? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任母谎,我火速辦了婚禮,結(jié)果婚禮上京革,老公的妹妹穿的比我還像新娘奇唤。我一直安慰自己,他們只是感情好匹摇,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布咬扇。 她就那樣靜靜地躺著,像睡著了一般廊勃。 火紅的嫁衣襯著肌膚如雪懈贺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天坡垫,我揣著相機與錄音梭灿,去河邊找鬼。 笑死冰悠,一個胖子當(dāng)著我的面吹牛堡妒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溉卓,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涕蚤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了的诵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤佑钾,失蹤者是張志新(化名)和其女友劉穎西疤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體休溶,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡代赁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了兽掰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭碍。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孽尽,靈堂內(nèi)的尸體忽然破棺而出窖壕,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布瞻讽,位于F島的核電站鸳吸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏速勇。R本人自食惡果不足惜晌砾,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦磁。 院中可真熱鬧养匈,春花似錦、人聲如沸都伪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽院溺。三九已至楣嘁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間珍逸,已是汗流浹背逐虚。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谆膳,地道東北人叭爱。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像漱病,于是被迫代替她去往敵國和親买雾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容