国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

HarmonyOS 應用開發(fā)學習筆記 狀態(tài)管理概述

這篇具有很好參考價值的文章主要介紹了HarmonyOS 應用開發(fā)學習筆記 狀態(tài)管理概述。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

移動端開發(fā),最重要的一點就是數(shù)據(jù)的處理,并且正確的顯示渲染UI。
變量在頁面和組件、組件和組件之間有時候并不能實時共享,而有時候,又不需要太多的作用域(節(jié)省資源),作用就需要根據(jù)不同場景,設置不同狀態(tài)的變量。
官方文檔

一、狀態(tài)管理概述

在聲明式UI編程框架中,UI是程序狀態(tài)的運行結果,用戶構建了一個UI模型,其中應用的運行時的狀態(tài)是參數(shù)。當參數(shù)改變時,UI作為返回結果,也將進行對應的改變。這些運行時的狀態(tài)變化所帶來的UI的重新渲染,在ArkUI中統(tǒng)稱為狀態(tài)管理機制。

簡單理解就是:當變量改變時,相關的UI也能跟著改變,為達到這個目的,引入了狀態(tài)變量

自定義組件擁有變量,變量必須被裝飾器裝飾才可以成為狀態(tài)變量,狀態(tài)變量的改變會引起UI的渲染刷新。如果不使用狀態(tài)變量,UI只能在初始化時渲染,后續(xù)將不會再刷新。 下圖展示了State和View(UI)之間的關系。

HarmonyOS 應用開發(fā)學習筆記 狀態(tài)管理概述,鴻蒙HarmonOS,harmonyos,學習,筆記,狀態(tài)管理,state,prop,Link,ets 裝飾器

因為

常規(guī)變量:沒有狀態(tài)的變量,通常應用于輔助計算。它的改變永遠不會引起UI的刷新。

所以引入狀態(tài)變量

狀態(tài)變量:被狀態(tài)裝飾器裝飾的變量,改變會引起UI的渲染更新。

State:狀態(tài),一般指的是裝飾器裝飾的數(shù)據(jù)。用戶通過觸發(fā)組件的事件方法,改變狀態(tài)數(shù)據(jù)。狀態(tài)數(shù)據(jù)的改變,引起UI的重新渲染。

二、 狀態(tài)管理總覽 管理應用擁有的狀態(tài)

1.管理組件擁有的狀態(tài)

Components級別的狀態(tài)管理

裝飾器 描述
@State @State裝飾的變量擁有其所屬組件的狀態(tài),可以作為其子組件單向和雙向同步的數(shù)據(jù)源。當其數(shù)值改變時,會引起相關組件的渲染刷新。
@Prop @Prop裝飾的變量可以和父組件建立單向同步關系,@Prop裝飾的變量是可變的,但修改不會同步回父組件。
@Link @Link裝飾的變量和父組件構建雙向同步關系的狀態(tài)變量,父組件會接受來自@Link裝飾的變量的修改的同步,父組件的更新也會同步給@Link裝飾的變量。
@Provide/@Consume @Provide/@Consume裝飾的變量用于跨組件層級(多層組件)同步狀態(tài)變量,可以不需要通過參數(shù)命名機制傳遞,通過alias(別名)或者屬性名綁定。
@Observed @Observed裝飾class,需要觀察多層嵌套場景的class需要被@Observed裝飾。單獨使用@Observed沒有任何作用,需要和@ObjectLink、@Prop連用。
@ObjectLink @ObjectLink裝飾的變量接收@Observed裝飾的class的實例,應用于觀察多層嵌套場景,和父組件的數(shù)據(jù)源構建雙向同步。

2.管理應用擁有的狀態(tài)

  • AppStorage是應用程序中的一個特殊的單例LocalStorage對象,是應用級的數(shù)據(jù)庫,和進程綁定,通過@StorageProp和@StorageLink裝飾器可以和組件聯(lián)動。
  • AppStorage是應用狀態(tài)的“中樞”,需要和組件(UI)交互的數(shù)據(jù)存入AppStorage,比如持久化數(shù)據(jù)PersistentStorage和環(huán)境變量Environment。UI再通過AppStorage提供的裝飾器或者API接口,訪問這些數(shù)據(jù);
  • 框架還提供了LocalStorage,AppStorage是LocalStorage特殊的單例。LocalStorage是應用程序聲明的應用狀態(tài)的內(nèi)存“數(shù)據(jù)庫”,通常用于頁面級的狀態(tài)共享,通過@LocalStorageProp和@LocalStorageLink裝飾器可以和UI聯(lián)動。

三、狀態(tài)介紹

1、@State裝飾器:組件內(nèi)狀態(tài)

@State裝飾器:組件內(nèi)狀態(tài)

示例

@Entry
@Component
struct MyComponent {
  @State count: number = 0;

  build() {
    Button(`click times: ${this.count}`)
      .onClick(() => {
        this.count += 1;
      })
  }
}

2、@Prop裝飾器:父子單向同步

@Prop裝飾器:父子單向同步

示例

  • @Prop customCounter沒有本地初始化,所以需要父組件提供數(shù)據(jù)源去初始化@Prop,并當父組件的數(shù)據(jù)源變化時,@Prop也將被更新;
  • @Prop customCounter2有本地初始化,在這種情況下,@Prop依舊允許但非強制父組件同步數(shù)據(jù)源給@Prop。
@Component
struct MyComponent {
  @Prop customCounter: number;
  @Prop customCounter2: number = 5;

  build() {
    Column() {
      Row() {
        Text(`From Main: ${this.customCounter}`).width(90).height(40).fontColor('#FF0010')
      }

      Row() {
        Button('Click to change locally !').width(180).height(60).margin({ top: 10 })
          .onClick(() => {
            this.customCounter2++
          })
      }.height(100).width(180)
      Row() {
        Text(`Custom Local: ${this.customCounter2}`).width(90).height(40).fontColor('#FF0010')
      }
    }
  }
}
@Entry
@Component
struct MainProgram {
  @State mainCounter: number = 10;
  build() {
    Column() {
      Row() {
        Column() {
          Button('Click to change number').width(480).height(60).margin({ top: 10, bottom: 10 })
            .onClick(() => {
              this.mainCounter++
            })
        }
      }
      Row() {
        Column()
        // customCounter必須從父組件初始化,因為MyComponent的customCounter成員變量缺少本地初始化;此處,customCounter2可以不做初始化。
        MyComponent({ customCounter: this.mainCounter })
        // customCounter2也可以從父組件初始化,父組件初始化的值會覆蓋子組件customCounter2的本地初始化的值
        MyComponent({ customCounter: this.mainCounter, customCounter2: this.mainCounter })
      }
    }
  }
}

3、@Link裝飾器:父子雙向同步

@Link裝飾器:父子雙向同步

示例解釋:
父組件定了了兩個變量(@State greenButtonState,@State yellowButtonProp),傳遞給子組件,子組件使用@Link裝飾器關聯(lián),當這兩個變量在父組件改變時,子組件里面的值也跟著改變從而改變UI,同時由于@Link的關系,這兩個參數(shù)在子組件里面改變了,也會夫組件里的變量也會跟著改變

class GreenButtonState {
  width: number = 0;
  constructor(width: number) {
    this.width = width;
  }
}
@Component
struct GreenButton {
  @Link greenButtonState: GreenButtonState;
  build() {
    Button('Green Button')
      .width(this.greenButtonState.width)
      .height(150.0)
      .backgroundColor('#00ff00')
      .onClick(() => {
        if (this.greenButtonState.width < 700) {
          // 更新class的屬性,變化可以被觀察到同步回父組件
          this.greenButtonState.width += 125;
        } else {
          // 更新class,變化可以被觀察到同步回父組件
          this.greenButtonState = new GreenButtonState(100);
        }
      })
  }
}
@Component
struct YellowButton {
  @Link yellowButtonState: number;
  build() {
    Button('Yellow Button')
      .width(this.yellowButtonState)
      .height(150.0)
      .backgroundColor('#ffff00')
      .onClick(() => {
        // 子組件的簡單類型可以同步回父組件
        this.yellowButtonState += 50.0;
      })
  }
}
@Entry
@Component
struct ShufflingContainer {
  @State greenButtonState: GreenButtonState = new GreenButtonState(300);
  @State yellowButtonProp: number = 100;
  build() {
    Column() {
      // 簡單類型從父組件@State向子組件@Link數(shù)據(jù)同步
      Button('Parent View: Set yellowButton')
        .onClick(() => {
          this.yellowButtonProp = (this.yellowButtonProp < 700) ? this.yellowButtonProp + 100 : 100;
        })
      // class類型從父組件@State向子組件@Link數(shù)據(jù)同步
      Button('Parent View: Set GreenButton')
        .onClick(() => {
          this.greenButtonState.width = (this.greenButtonState.width < 700) ? this.greenButtonState.width + 100 : 100;
        })
      // class類型初始化@Link
      GreenButton({ greenButtonState: $greenButtonState })
      // 簡單類型初始化@Link
      YellowButton({ yellowButtonState: $yellowButtonProp })
    }
  }
}

4、@Provide裝飾器和@Consume裝飾器:與后代組件雙向同步

@Provide裝飾器和@Consume裝飾器:與后代組件雙向同步

示例:
在下面的示例是與后代組件雙向同步狀態(tài)@Provide和@Consume場景。當分別點擊CompA和CompD組件內(nèi)Button時,reviewVotes 的更改會雙向同步在CompA和CompD中。

@Component
struct CompD {
  // @Consume裝飾的變量通過相同的屬性名綁定其祖先組件CompA內(nèi)的@Provide裝飾的變量
  @Consume reviewVotes: number;

  build() {
    Column() {
      Text(`reviewVotes(${this.reviewVotes})`)
      Button(`reviewVotes(${this.reviewVotes}), give +1`)
        .onClick(() => this.reviewVotes += 1)
    }
    .width('50%')
  }
}
@Component
struct CompC {
  build() {
    Row({ space: 5 }) {
      CompD()
      CompD()
    }
  }
}
@Component
struct CompB {
  build() {
    CompC()
  }
}
@Entry
@Component
struct CompA {
  // @Provide裝飾的變量reviewVotes由入口組件CompA提供其后代組件
  @Provide reviewVotes: number = 0;
  build() {
    Column() {
      Button(`reviewVotes(${this.reviewVotes}), give +1`)
        .onClick(() => this.reviewVotes += 1)
      CompB()
    }
  }
}

5、@Observed裝飾器和@ObjectLink裝飾器:嵌套類對象屬性變化

@Observed裝飾器和@ObjectLink裝飾器:嵌套類對象屬性變化

6、LocalStorage:頁面級UI狀態(tài)存儲

LocalStorage:頁面級UI狀態(tài)存儲

7、AppStorage:應用全局的UI狀態(tài)存儲

AppStorage:應用全局的UI狀態(tài)存儲

8、PersistentStorage:持久化存儲UI狀態(tài)

PersistentStorage:持久化存儲UI狀態(tài)

9、Environment:設備環(huán)境查詢

Environment:設備環(huán)境查詢

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

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

11、$$語法:內(nèi)置組件雙向同步

$$語法:內(nèi)置組件雙向同步文章來源地址http://www.zghlxwxcb.cn/news/detail-777190.html

到了這里,關于HarmonyOS 應用開發(fā)學習筆記 狀態(tài)管理概述的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • HarmonyOS應用開發(fā)學習筆記 UI布局學習 柵格布局(GridRow/GridCol)

    HarmonyOS應用開發(fā)學習筆記 UI布局學習 柵格布局(GridRow/GridCol)

    HarmonyOS應用開發(fā)學習筆記 UI布局學習 相對布局 (RelativeContainer) 官方文檔:柵格布局(GridRow/GridCol) 通過設置GridRow的direction屬性來指定柵格子組件在柵格容器中的排列方向 代碼 描述 GridRowDirection.Row 從左往右排列 GridRowDirection.RowReverse 從右往左排列 左往右排列 子組件從右

    2024年02月03日
    瀏覽(23)
  • HarmonyOS應用開發(fā)學習筆記 UI布局學習 List(){}創(chuàng)建列表 列表形式顯示 簡單使用

    HarmonyOS應用開發(fā)學習筆記 UI布局學習 List(){}創(chuàng)建列表 列表形式顯示 簡單使用

    List 創(chuàng)建列表 列表形式顯示 官方文檔:創(chuàng)建列表(List) 關鍵代碼 List(){} 列表控件 ListItem() {} 子元素 例如 關鍵代碼:listDirection(Axis.Horizontal) 默認豎直方向 Axis.Vertical 分隔線的寬度會使ListItem之間存在一定間隔,當List設置的內(nèi)容間距小于分隔線寬度時,ListItem之間的間隔會使用

    2024年02月02日
    瀏覽(34)
  • HarmonyOS應用開發(fā)學習筆記 UIAbility組件與UI的數(shù)據(jù)同步 EventHub、globalThis

    HarmonyOS應用開發(fā)學習筆記 UIAbility組件與UI的數(shù)據(jù)同步 EventHub、globalThis

    1、 HarmoryOS Ability頁面的生命周期 2、 @Component自定義組件 3、HarmonyOS 應用開發(fā)學習筆記 ets組件生命周期 4、HarmonyOS 應用開發(fā)學習筆記 ets組件樣式定義 @Styles裝飾器:定義組件重用樣式 @Extend裝飾器:定義擴展組件樣式 5、HarmonyOS 應用開發(fā)學習筆記 state狀態(tài)管理概述 6、HarmonyO

    2024年02月03日
    瀏覽(31)
  • HarmonyOS應用開發(fā)學習筆記 UI布局學習 創(chuàng)建輪播(Swiper) artTS 輪播組件 簡單使用

    HarmonyOS應用開發(fā)學習筆記 UI布局學習 創(chuàng)建輪播(Swiper) artTS 輪播組件 簡單使用

    官方文檔 Swiper組件提供滑動輪播顯示的能力。Swiper本身是一個容器組件,當設置了多個子組件后,可以對這些子組件進行輪播顯示。通常,在一些應用首頁顯示推薦的內(nèi)容時,需要用到輪播顯示的能力。 loop 控制是否循環(huán) this.swiperController.showNext(); // 通過controller切換到后一頁

    2024年02月02日
    瀏覽(37)
  • HarmonyOS應用開發(fā)者基礎筆記

    HarmonyOS應用開發(fā)者基礎筆記

    HOS認證基礎筆記 HarmonyOS應用開發(fā)者高級認證筆記 華子鴻蒙開發(fā)認證(認證鏈接),粗略看了看感覺還行,遂1h22min速通 首選項preferences是以Key-Value形式存儲數(shù)據(jù),其中Key是可以重復。(錯) 使用http模塊發(fā)起網(wǎng)絡請求時,必須要使用on(‘headersReceive’)訂閱請求頭,請求才會成

    2024年02月02日
    瀏覽(25)
  • 《HarmonyOS開發(fā) – OpenHarmony開發(fā)筆記(基于小型系統(tǒng))》第4章 OpenHarmony應用開發(fā)實例

    《HarmonyOS開發(fā) – OpenHarmony開發(fā)筆記(基于小型系統(tǒng))》第4章 OpenHarmony應用開發(fā)實例

    開發(fā)環(huán)境 : 開發(fā)系統(tǒng):Ubuntu 20.04 開發(fā)板:Pegasus物聯(lián)網(wǎng)開發(fā)板 MCU:Hi3861 OpenHarmony版本:3.0.1-LTS 1.新建工程及源碼 新建目錄 在applications/sample/myapp中新建src目錄以及myapp.c文件,代碼如下所示。 新建編譯組織文件 新建applications/sample/myapp/BUILD.gn文件,內(nèi)容如下所示: static_libr

    2024年02月09日
    瀏覽(36)
  • 鴻蒙應用開發(fā)學習路線(OpenHarmony/HarmonyOS)

    鴻蒙應用開發(fā)學習路線(OpenHarmony/HarmonyOS)

    作者:堅果 團隊:堅果派 公眾號:“大前端之旅” 潤開鴻技術專家,華為HDE,InfoQ簽約作者,OpenHarmony布道師,擅長HarmonyOS應用開發(fā)、熟悉服務卡片開發(fā),在“戰(zhàn)碼先鋒”活動中作為大隊長,累計培養(yǎng)三個小隊長,帶領100+隊員完成Pr的提交合入。 歡迎通過主頁或者私信聯(lián)系

    2024年02月15日
    瀏覽(97)
  • OpenHarmony 應用 ArkUI 狀態(tài)管理開發(fā)范例

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

    本文轉載自《#2023 盲盒+碼 #?OpenHarmony 應用 ArkUI?狀態(tài)管理開發(fā)范例》,作者:zhushangyuan_ 本文根據(jù)橘子購物應用,實現(xiàn) ArkUI 中的狀態(tài)管理。 在聲明式 UI 編程框架中,UI 是程序狀態(tài)的運行結果,用戶構建了一個 UI 模型,其中應用的運行時的狀態(tài)是參數(shù)。當參數(shù)改變時,UI 作為

    2024年02月10日
    瀏覽(26)
  • HarmonyOS學習路之方舟開發(fā)框架—學習ArkTS語言(狀態(tài)管理 二)

    HarmonyOS學習路之方舟開發(fā)框架—學習ArkTS語言(狀態(tài)管理 二)

    @Prop裝飾的變量可以和父組件建立單向的同步關系。@Prop裝飾的變量是可變的,但是變化不會同步回其父組件。 @Prop裝飾的變量和父組件建立單向的同步關系: @Prop變量允許在本地修改,但修改后的變化不會同步回父組件。 當父組件中的數(shù)據(jù)源更改時,與之相關的@Prop裝飾的變

    2024年02月14日
    瀏覽(46)
  • HarmonyOS學習路之方舟開發(fā)框架—學習ArkTS語言(狀態(tài)管理 六)

    HarmonyOS學習路之方舟開發(fā)框架—學習ArkTS語言(狀態(tài)管理 六)

    AppStorage是應用全局的UI狀態(tài)存儲,是和應用的進程綁定的,由UI框架在應用程序啟動時創(chuàng)建,為應用程序UI狀態(tài)屬性提供中央存儲。 和LocalStorage不同的是,LocalStorage是頁面級的,通常應用于頁面內(nèi)的數(shù)據(jù)共享。而對于AppStorage,是應用級的全局狀態(tài)共享。 AppStorage是在應用啟動

    2024年02月20日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包