0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony頁面級(jí)變量的狀態(tài)管理

ArkUI詳解 ? 來源:ArkUI詳解 ? 作者:ArkUI詳解 ? 2022-12-07 08:58 ? 次閱讀

狀態(tài)管理

@State、@Prop、@Link、@Provide、Consume、@ObjectLink、@Observed和@Watch用于管理頁面級(jí)變量的狀態(tài)。

裝飾器 裝飾內(nèi)容 說明
@State 基本數(shù)據(jù)類型,類,數(shù)組 修飾的狀態(tài)數(shù)據(jù)被修改時(shí)會(huì)觸發(fā)組件的build方法進(jìn)行UI界面更新。
@Prop 基本數(shù)據(jù)類型 修改后的狀態(tài)數(shù)據(jù)用于在父組件和子組件之間建立單向數(shù)據(jù)依賴關(guān)系。修改父組件關(guān)聯(lián)數(shù)據(jù)時(shí),當(dāng)前組件會(huì)重新渲染。
@Link 基本數(shù)據(jù)類型,類,數(shù)組 父子組件之間的雙向數(shù)據(jù)綁定,父組件的內(nèi)部狀態(tài)數(shù)據(jù)作為數(shù)據(jù)源,任何一方所做的修改都會(huì)反映給另一方。
@Observed @Observed應(yīng)用于類,表示該類中的數(shù)據(jù)變更被UI頁面管理。
@ObjectLink 被@Observed所裝飾類的對(duì)象 @ObjectLink裝飾的狀態(tài)數(shù)據(jù)被修改時(shí),在父組件或者其他兄弟組件內(nèi)與它關(guān)聯(lián)的狀態(tài)數(shù)據(jù)所在的組件都會(huì)重新渲染。
@Consume 基本數(shù)據(jù)類型,類,數(shù)組 @Consume裝飾的變量在感知到@Provide裝飾的變量更新后,會(huì)觸發(fā)當(dāng)前自定義組件的重新渲染。
@Provide 基本數(shù)據(jù)類型,類,數(shù)組 @Provide作為數(shù)據(jù)的提供方,可以更新其子孫節(jié)點(diǎn)的數(shù)據(jù),并觸發(fā)頁面重新渲染。

@State

@State裝飾的變量是組件內(nèi)部的狀態(tài)數(shù)據(jù),當(dāng)這些狀態(tài)數(shù)據(jù)被修改時(shí),將會(huì)調(diào)用所在組件的build方法進(jìn)行UI刷新。

@State狀態(tài)數(shù)據(jù)具有以下特征:

支持多種類型數(shù)據(jù):支持class、number、boolean、string強(qiáng)類型數(shù)據(jù)的值類型和引用類型,以及這些強(qiáng)類型構(gòu)成的數(shù)組,即Array、Array、Array、Array。不支持object和any。

支持多實(shí)例:組件不同實(shí)例的內(nèi)部狀態(tài)數(shù)據(jù)獨(dú)立。

內(nèi)部私有:標(biāo)記為@State的屬性是私有變量,只能在組件內(nèi)訪問。

需要本地初始化:必須為所有@State變量分配初始值,變量未初始化可能導(dǎo)致未定義的框架異常行為。

創(chuàng)建自定義組件時(shí)支持通過狀態(tài)變量名設(shè)置初始值:在創(chuàng)建組件實(shí)例時(shí),可以通過變量名顯式指定@State狀態(tài)變量的初始值。

@Prop

@Prop與@State有相同的語義,但初始化方式不同。@Prop裝飾的變量必須使用其父組件提供的@State變量進(jìn)行初始化,允許組件內(nèi)部修改@Prop變量,但變量的更改不會(huì)通知給父組件,即@Prop屬于單向數(shù)據(jù)綁定。

@Prop狀態(tài)數(shù)據(jù)具有以下特征:

支持簡單類型:僅支持number、string、boolean等簡單數(shù)據(jù)類型;

私有:僅支持組件內(nèi)訪問;

支持多個(gè)實(shí)例:一個(gè)組件中可以定義多個(gè)標(biāo)有@Prop的屬性;

創(chuàng)建自定義組件時(shí)將值傳遞給@Prop變量進(jìn)行初始化:在創(chuàng)建組件的新實(shí)例時(shí),必須初始化所有@Prop變量,不支持在組件內(nèi)部進(jìn)行初始化

@Link

@Link裝飾的變量可以和父組件的@State變量建立雙向數(shù)據(jù)綁定:

支持多種類型:@Link支持的數(shù)據(jù)類型與@State相同,即class、number、string、boolean或這些類型的數(shù)組;

私有:僅支持組件內(nèi)訪問;

單個(gè)數(shù)據(jù)源:父組件中用于初始化子組件@Link變量的必須是@State變量;

雙向通信:子組件對(duì)@Link變量的更改將同步修改父組件中的@State變量;

創(chuàng)建自定義組件時(shí)需要將變量的引用傳遞給@Link變量,在創(chuàng)建組件的新實(shí)例時(shí),必須使用命名參數(shù)初始化所有@Link變量。@Link變量可以使用@State變量或@Link變量的引用進(jìn)行初始化,@State變量可以通過'$'操作符創(chuàng)建引用。

@Observed和ObjectLink數(shù)據(jù)管理

開發(fā)者只想針對(duì)父組件中某個(gè)數(shù)據(jù)對(duì)象的部分信息進(jìn)行同步時(shí),如果這些部分信息是一個(gè)類對(duì)象,就可以使用@ObjectLink配合@Observed來實(shí)現(xiàn),如下圖所示。

@Observed用于類,@ObjectLink用于變量。

@ObjectLink裝飾的變量類型必須為類(class type)。

類要被@Observed裝飾器所裝飾。

不支持簡單類型參數(shù),可以使用@Prop進(jìn)行單向同步。

@ObjectLink裝飾的變量是不可變的。

屬性的改動(dòng)是被允許的,當(dāng)改動(dòng)發(fā)生時(shí),如果同一個(gè)對(duì)象被多個(gè)@ObjectLink變量所引用,那么所有擁有這些變量的自定義組件都會(huì)被通知進(jìn)行重新渲染。

@ObjectLink裝飾的變量不可設(shè)置默認(rèn)值。

必須讓父組件中有一個(gè)由@State、@Link、@StorageLink、@Provide或@Consume裝飾的變量所參與的TS表達(dá)式進(jìn)行初始化。

@ObjectLink裝飾的變量是私有變量,只能在組件內(nèi)訪問

@Consume和@Provide

@Provide作為數(shù)據(jù)的提供方,可以更新其子孫節(jié)點(diǎn)的數(shù)據(jù),并觸發(fā)頁面渲染。@Consume在感知到@Provide數(shù)據(jù)的更新后,會(huì)觸發(fā)當(dāng)前自定義組件的重新渲染。

@Provide

名稱 說明
裝飾器參數(shù) 是一個(gè)string類型的常量,用于給裝飾的變量起別名。如果規(guī)定別名,則提供對(duì)應(yīng)別名的數(shù)據(jù)更新。如果沒有,則使用變量名作為別名。推薦使用@Provide('alias')這種形式。
同步機(jī)制 @Provide的變量類似@State,可以修改對(duì)應(yīng)變量進(jìn)行頁面重新渲染。也可以修改@Consume裝飾的變量,反向修改@State變量。
初始值 必須設(shè)置初始值。
頁面重渲染場(chǎng)景 觸發(fā)頁面渲染的修改:- 基礎(chǔ)類型(boolean,string,number)變量的改變;- @Observed class類型變量及其屬性的修改;- 添加,刪除,更新數(shù)組中的元素。

@Consume

類型 說明
初始值 不可設(shè)置默認(rèn)初始值。

@Watch

@Watch用于監(jiān)聽狀態(tài)變量的變化

具體允許哪種方式取決于狀態(tài)變量的裝飾器:

裝飾器類型 本地初始化 通過構(gòu)造函數(shù)參數(shù)初始化
@State 必須 可選
@Prop 禁止 必須
@Link 禁止 必須
@StorageLink 必須 禁止
@StorageProp 必須 禁止
@Provide 必須 可選
@Consume 禁止 禁止
@ObjectLink 禁止 必須
常規(guī)成員變量 推薦 可選

從上表中可以看出:

@State變量需要本地初始化,初始化的值可以被構(gòu)造參數(shù)覆蓋。

@Prop和@Link變量必須且僅通過構(gòu)造函數(shù)參數(shù)進(jìn)行初始化。

通過構(gòu)造函數(shù)方法初始化成員變量,需要遵循如下規(guī)則:

從父組件中的變量(下)到子組件中的變量(右) @State @Link @Prop 常規(guī)變量
@State 不允許 允許 允許 允許
@Link 不允許 允許 不推薦 允許
@Prop 不允許 不允許 允許 允許
@StorageLink 不允許 允許 不允許 允許
@StorageProp 不允許 不允許 不允許 允許
常規(guī)變量 允許 不允許 不允許 允許

從上表中可以看出:

父組件的常規(guī)變量可以用于初始化子組件的@State變量,但不能用于初始化@Link或@Prop變量。

父組件的@State變量可以初始化子組件的@Prop、@Link(通過$)或常規(guī)變量,但不能初始化子組件的@State變量。

父組件的@Link變量可以初始化子組件的@Link或常規(guī)變量。但是初始化子組件的@State成員是語法錯(cuò)誤,此外不建議初始化@Prop。

父組件的@Prop變量可以初始化子組件的常規(guī)變量或@Prop變量,但不能初始化子組件的@State或@Link變量。

@StorageLink和@StorageProp不允許由父組件中傳遞到子組件。

除了上述規(guī)則外,還需要遵循TS的強(qiáng)類型規(guī)則。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28306
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3636

    瀏覽量

    16061
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙OS開發(fā)實(shí)例:【應(yīng)用狀態(tài)變量共享】

    平時(shí)在開發(fā)的過程中,我們會(huì)在應(yīng)用中共享數(shù)據(jù),在不同的頁面間共享信息。雖然常用的共享信息,也可以通過不同頁面中組件間信息共享的方式,但有時(shí)使用應(yīng)用級(jí)別的狀態(tài)管理會(huì)讓開發(fā)工作變得簡單。
    的頭像 發(fā)表于 04-03 15:09 ?1211次閱讀
    鴻蒙OS開發(fā)實(shí)例:【應(yīng)用<b class='flag-5'>狀態(tài)變量</b>共享】

    harmonyos開發(fā)者平臺(tái)

    使用@State、@Prop、@Link、@Watch、@Provide、@Consume管理頁面級(jí)變量狀態(tài),實(shí)現(xiàn)對(duì)
    的頭像 發(fā)表于 05-06 16:02 ?799次閱讀
    harmonyos開發(fā)者平臺(tái)

    HarmonyOS實(shí)踐之應(yīng)用狀態(tài)變量共享

    平時(shí)在開發(fā)的過程中,我們會(huì)在應(yīng)用中共享數(shù)據(jù),在不同的頁面間共享信息。雖然常用的共享信息,也可以通過不同頁面中組件間信息共享的方式,但有時(shí)使用應(yīng)用級(jí)別的狀態(tài)管理會(huì)讓開發(fā)工作變得簡單。 根
    發(fā)表于 12-27 09:48

    Harmony 鴻蒙頁面級(jí)變量狀態(tài)管理

    頁面級(jí)變量狀態(tài)管理 @State、@Prop、@Link、@Provide、@Consume、@ObjectLink、@Observed和
    發(fā)表于 01-24 20:04

    OpenHarmony應(yīng)用ArkUI 狀態(tài)管理開發(fā)范例

    本文轉(zhuǎn)載自《#2023盲盒+碼# OpenHarmony應(yīng)用ArkUI 狀態(tài)管理開發(fā)范例》,作者:zhushangyuan_ 本文根據(jù)橘子購物應(yīng)用,實(shí)現(xiàn)ArkUI中的狀態(tài)
    發(fā)表于 09-01 15:03

    OpenHarmony頁面級(jí)UI狀態(tài)存儲(chǔ):LocalStorage

    LocalStorage是頁面級(jí)的UI狀態(tài)存儲(chǔ),通過@Entry裝飾器接收的參數(shù)可以在頁面內(nèi)共享同一個(gè)LocalStorage實(shí)例。LocalStorage也可以在UIAbility內(nèi)
    發(fā)表于 10-17 17:01

    OpenHarmony狀態(tài)變量更改通知:@Watch裝飾器

    @Watch應(yīng)用于對(duì)狀態(tài)變量的監(jiān)聽。如果開發(fā)者需要關(guān)注某個(gè)狀態(tài)變量的值是否改變,可以使用@Watch為狀態(tài)變量設(shè)置回調(diào)函數(shù)。 說明: 從API version 9開始,該裝飾器支持在ArkTS卡片
    發(fā)表于 10-31 17:45

    動(dòng)態(tài)電路的狀態(tài)變量分析

    動(dòng)態(tài)電路的狀態(tài)變量分析􀂄 7.1 電路的狀態(tài)狀態(tài)變量􀂄 7.2 狀態(tài)方程及其列寫􀂄 7.3
    發(fā)表于 12-04 18:01 ?0次下載
    動(dòng)態(tài)電路的<b class='flag-5'>狀態(tài)變量</b>分析

    狀態(tài)變量濾波器,狀態(tài)變量濾波器原理是什么?

    狀態(tài)變量濾波器,狀態(tài)變量濾波器原理是什么? 狀態(tài)變量濾波器,又稱多態(tài)變量濾波器,它可以分別從不同的點(diǎn)同時(shí)輸出高通、帶通、低通等,且
    發(fā)表于 03-24 14:24 ?6595次閱讀

    關(guān)于UI頁面狀態(tài):空白狀態(tài)

    設(shè)計(jì)師必須讓用戶在 首次使用 就有好的體驗(yàn)!本篇就要探討設(shè)計(jì)師最常忽略的頁面 空白狀態(tài)(empty state) 頁面。 大多 app 平均會(huì)失去 77% 的用戶(用戶下載后三天)。更糟的是,在
    發(fā)表于 09-26 11:45 ?0次下載

    簡單實(shí)用的頁面狀態(tài)布局

    項(xiàng)目介紹 項(xiàng)目名稱:loadinglayout 所屬系列:openharmony第三方組件適配移植 功能:簡單實(shí)用的頁面狀態(tài)布局(content,loading,empty,error) 項(xiàng)目移植
    發(fā)表于 03-21 11:21 ?6次下載
    簡單實(shí)用的<b class='flag-5'>頁面</b>多<b class='flag-5'>狀態(tài)</b>布局

    基于openharmony適配移植可以下拉消失的頁面滑塊

    項(xiàng)目介紹 項(xiàng)目名稱:頁面滑塊 所屬系列:openharmony的第三方組件適配移植 功能:可以下拉消失的PageSlider 項(xiàng)目移植狀態(tài):主功能完成 調(diào)用差異:無 開發(fā)版本:sdk6,DevEco
    發(fā)表于 04-08 09:46 ?1次下載

    基于openharmony適配移植可從后臺(tái)動(dòng)態(tài)變更頁面的組件

    項(xiàng)目介紹 項(xiàng)目名稱:Proteus 所屬系列:openharmony 第三方組件適配移植 功能:一個(gè)可從后臺(tái)動(dòng)態(tài)變更頁面的組件 項(xiàng)目移植狀態(tài):主功能完成 調(diào)用差異:有(json數(shù)據(jù)中將布局名稱等更換
    發(fā)表于 04-08 10:24 ?4次下載

    Harmony 鴻蒙應(yīng)用級(jí)變量狀態(tài)管理

    應(yīng)用級(jí)變量狀態(tài)管理 在前面的章節(jié)中,已經(jīng)講述了如何管理頁面
    的頭像 發(fā)表于 01-24 21:30 ?448次閱讀
    Harmony 鴻蒙應(yīng)用<b class='flag-5'>級(jí)</b><b class='flag-5'>變量</b>的<b class='flag-5'>狀態(tài)</b><b class='flag-5'>管理</b>

    Harmony 鴻蒙頁面級(jí)變量狀態(tài)管理

    頁面級(jí)變量狀態(tài)管理 @State、@Prop、@Link、@Provide、@Consume、@ObjectLink、@Observed和
    的頭像 發(fā)表于 01-25 10:42 ?538次閱讀
    Harmony 鴻蒙<b class='flag-5'>頁面</b><b class='flag-5'>級(jí)</b><b class='flag-5'>變量</b>的<b class='flag-5'>狀態(tài)</b><b class='flag-5'>管理</b>