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

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

這篇具有很好參考價值的文章主要介紹了HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—學(xué)習(xí)ArkTS語言(狀態(tài)管理 六)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

AppStorage是應(yīng)用全局的UI狀態(tài)存儲,是和應(yīng)用的進(jìn)程綁定的,由UI框架在應(yīng)用程序啟動時創(chuàng)建,為應(yīng)用程序UI狀態(tài)屬性提供中央存儲。

和LocalStorage不同的是,LocalStorage是頁面級的,通常應(yīng)用于頁面內(nèi)的數(shù)據(jù)共享。而對于AppStorage,是應(yīng)用級的全局狀態(tài)共享。

概述

AppStorage是在應(yīng)用啟動的時候會被創(chuàng)建的單例。它的目的是為了提供應(yīng)用狀態(tài)數(shù)據(jù)的中心存儲,這些狀態(tài)數(shù)據(jù)在應(yīng)用級別都是可訪問的。AppStorage將在應(yīng)用運行過程保留其屬性。屬性通過唯一的鍵字符串值訪問。

AppStorage可以和UI組件同步,且可以在應(yīng)用業(yè)務(wù)邏輯中被訪問。

AppStorage中的屬性可以被雙向同步,數(shù)據(jù)可以是存在于本地或遠(yuǎn)程設(shè)備上,并具有不同的功能,比如數(shù)據(jù)持久化。

@StorageProp

在上文中已經(jīng)提到,如果要建立AppStorage和自定義組件的聯(lián)系,需要使用@StorageProp和@StorageLink裝飾器。使用@StorageProp(key)/@StorageLink(key)裝飾組件內(nèi)的變量,key標(biāo)識了AppStorage的屬性。

當(dāng)自定義組件初始化的時候,@StorageProp(key)/@StorageLink(key)裝飾的變量會通過給定的key,綁定在AppStorage對應(yīng)的屬性,完成初始化。本地初始化是必要的,因為無法保證AppStorage一定存在給定的key,這取決于應(yīng)用邏輯,是否在組件初始化之前在AppStorage實例中存入對應(yīng)的屬性。

@StorageProp(key)是和AppStorage中key對應(yīng)的屬性建立單向數(shù)據(jù)同步,我們允許本地改變的發(fā)生,但是對于@StorageProp,本地的修改永遠(yuǎn)不會同步回AppStorage中,相反,如果AppStorage給定key的屬性發(fā)生改變,改變會被同步給@StorageProp,并覆蓋掉本地的修改。

裝飾器使用規(guī)則說明

@StorageProp變量裝飾器

說明

裝飾器參數(shù)

key:常量字符串,必填(字符串需要有引號)。

允許裝飾的變量類型

Object class、string、number、boolean、enum類型,以及這些類型的數(shù)組。

類型必須被指定,且必須和LocalStorage中對應(yīng)屬性相同。不支持any,不允許使用undefined和null。

同步類型

單向同步:從AppStorage的對應(yīng)屬性到組件的狀態(tài)變量。

組件本地的修改是允許的,但是AppStorage中給定的屬性一旦發(fā)生變化,將覆蓋本地的修改。

被裝飾變量的初始值

必須指定,如果AppStorage實例中不存在屬性,則作為初始化默認(rèn)值,并存入AppStorage中。

變量的傳遞/訪問規(guī)則說明

傳遞/訪問

說明

從父節(jié)點初始化和更新

禁止,@StorageProp不支持從父節(jié)點初始化,只能AppStorage中key對應(yīng)的屬性初始化,如果沒有對應(yīng)key的話,將使用本地默認(rèn)值初始化

初始化子節(jié)點

支持,可用于初始化@State、@Link、@Prop、@Provide。

是否支持組件外訪問

否。

圖1?@StorageProp初始化規(guī)則圖示

localstorage和appstorage,HarmonyOS方舟(ArkUI)框架開發(fā),學(xué)習(xí),ArkTS,harmonyos,華為,組件狀態(tài)

觀察變化和行為表現(xiàn)

觀察變化

  • 當(dāng)裝飾的數(shù)據(jù)類型為boolean、string、number類型時,可以觀察到數(shù)值的變化。
  • 當(dāng)裝飾的數(shù)據(jù)類型為class或者Object時,可以觀察到賦值和屬性賦值的變化,即Object.keys(observedObject)返回的所有屬性。
  • 當(dāng)裝飾的對象是array時,可以觀察到數(shù)組添加、刪除、更新數(shù)組單元的變化。

框架行為

  • 當(dāng)@StorageProp(key)裝飾的數(shù)值改變被觀察到時,修改不會被同步回AppStorage對應(yīng)屬性鍵值key的屬性中。
  • 當(dāng)前@StorageProp(key)單向綁定的數(shù)據(jù)會被修改,即僅限于當(dāng)前組件的私有成員變量改變,其他的綁定該key的數(shù)據(jù)不會同步改變。
  • 當(dāng)@StorageProp(key)裝飾的數(shù)據(jù)本身是狀態(tài)變量,它的改變雖然不會同步回AppStorage中,但是會引起所屬的自定義組件的重新渲染。
  • 當(dāng)AppStorage中key對應(yīng)的屬性發(fā)生改變時,會同步給所有@StorageProp(key)裝飾的數(shù)據(jù),@StorageProp(key)本地的修改將被覆蓋。

@StorageLink

@StorageLink(key)是和AppStorage中key對應(yīng)的屬性建立雙向數(shù)據(jù)同步:

  1. 本地修改發(fā)生,該修改會被寫回AppStorage中;
  2. AppStorage中的修改發(fā)生后,該修改會被同步到所有綁定AppStorage對應(yīng)key的屬性上,包括單向(@StorageProp和通過Prop創(chuàng)建的單向綁定變量)、雙向(@StorageLink和通過Link創(chuàng)建的雙向綁定變量)變量和其他實例(比如PersistentStorage)。

裝飾器使用規(guī)則說明

@StorageLink變量裝飾器

說明

裝飾器參數(shù)

key:常量字符串,必填(字符串需要有引號)。

允許裝飾的變量類型

Object、class、string、number、boolean、enum類型,以及這些類型的數(shù)組。

類型必須被指定,且必須和AppStorage中對應(yīng)屬性相同。不支持any,不允許使用undefined和null。

同步類型

雙向同步:從AppStorage的對應(yīng)屬性到自定義組件,從自定義組件到AppStorage對應(yīng)屬性。

被裝飾變量的初始值

必須指定,如果AppStorage實例中不存在屬性,則作為初始化默認(rèn)值,并存入AppStorage中。

變量的傳遞/訪問規(guī)則說明

傳遞/訪問

說明

從父節(jié)點初始化和更新

禁止。

初始化子節(jié)點

支持,可用于初始化常規(guī)變量、@State、@Link、@Prop、@Provide。

是否支持組件外訪問

否。

圖2?@StorageLink初始化規(guī)則圖示

localstorage和appstorage,HarmonyOS方舟(ArkUI)框架開發(fā),學(xué)習(xí),ArkTS,harmonyos,華為,組件狀態(tài)

觀察變化和行為表現(xiàn)

觀察變化

  • 當(dāng)裝飾的數(shù)據(jù)類型為boolean、string、number類型時,可以觀察到數(shù)值的變化。
  • 當(dāng)裝飾的數(shù)據(jù)類型為class或者Object時,可以觀察到賦值和屬性賦值的變化,即Object.keys(observedObject)返回的所有屬性。
  • 當(dāng)裝飾的對象是array時,可以觀察到數(shù)組添加、刪除、更新數(shù)組單元的變化。

框架行為

  1. 當(dāng)@StorageLink(key)裝飾的數(shù)值改變被觀察到時,修改將被同步回AppStorage對應(yīng)屬性鍵值key的屬性中。
  2. AppStorage中屬性鍵值key對應(yīng)的數(shù)據(jù)一旦改變,屬性鍵值key綁定的所有的數(shù)據(jù)(包括雙向@StorageLink和單向@StorageProp)都將同步修改;
  3. 當(dāng)@StorageLink(key)裝飾的數(shù)據(jù)本身是狀態(tài)變量,它的改變不僅僅會同步回AppStorage中,還會引起所屬的自定義組件的重新渲染。

使用場景

從應(yīng)用邏輯使用AppStorage和LocalStorage

AppStorage是單例,它的所有API都是靜態(tài)的,使用方法類似于LocalStorage對應(yīng)的非靜態(tài)方法。

AppStorage.SetOrCreate('PropA', 47);

let storage: LocalStorage = new LocalStorage({ 'PropA': 17 });
let propA: number = AppStorage.Get('PropA') // propA in AppStorage == 47, propA in LocalStorage == 17
var link1: SubscribedAbstractProperty<number> = AppStorage.Link('PropA'); // link1.get() == 47
var link2: SubscribedAbstractProperty<number> = AppStorage.Link('PropA'); // link2.get() == 47
var prop: SubscribedAbstractProperty<number> = AppStorage.Prop('PropA'); // prop.get() = 47

link1.set(48); // two-way sync: link1.get() == link2.get() == prop.get() == 48
prop.set(1); // one-way sync: prop.get()=1; but link1.get() == link2.get() == 48
link1.set(49); // two-way sync: link1.get() == link2.get() == prop.get() == 49

storage.get('PropA') // == 17 
storage.set('PropA', 101);
storage.get('PropA') // == 101

AppStorage.Get('PropA') // == 49
link1.get() // == 49
link2.get() // == 49
prop.get() // == 49

從UI內(nèi)部使用AppStorage和LocalStorage

@StorageLink變量裝飾器與AppStorage配合使用,正如@LocalStorageLink與LocalStorage配合使用一樣。此裝飾器使用AppStorage中的屬性創(chuàng)建雙向數(shù)據(jù)同步。

AppStorage.SetOrCreate('PropA', 47);
let storage = new LocalStorage({ 'PropA': 48 });

@Entry(storage)
@Component
struct CompA {
  @StorageLink('PropA') storLink: number = 1;
  @LocalStorageLink('PropA') localStorLink: number = 1;

  build() {
    Column({ space: 20 }) {
      Text(`From AppStorage ${this.storLink}`)
        .onClick(() => this.storLink += 1)

      Text(`From LocalStorage ${this.localStorLink}`)
        .onClick(() => this.localStorLink += 1)
    }
  }
}

以持久化方式訂閱某個事件并接收事件回調(diào)

推薦使用持久化方式訂閱某個事件并接收事件回調(diào),可以減少開銷,增強代碼的可讀性。

// xxx.ets
import emitter from '@ohos.events.emitter';

let NextID: number = 0;

class ViewData {
  title: string;
  uri: Resource;
  color: Color = Color.Black;
  id: number;

  constructor(title: string, uri: Resource) {
    this.title = title;
    this.uri = uri
    this.id = NextID++;
  }
}

@Entry
@Component
struct Gallery2 {
  dataList: Array<ViewData> = [new ViewData('flower', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon'))]
  scroller: Scroller = new Scroller()
  private preIndex: number = -1

  build() {
    Column() {
      Grid(this.scroller) {
        ForEach(this.dataList, (item: ViewData) => {
          GridItem() {
            TapImage({
              uri: item.uri,
              index: item.id
            })
          }.aspectRatio(1)
          .onClick(() => {
            if (this.preIndex === item.id) {
              return
            }
            var innerEvent = { eventId: item.id }
            // 選中態(tài):黑變紅
            var eventData = {
              data: {
                "colorTag": 1
              }
            }
            emitter.emit(innerEvent, eventData)

            if (this.preIndex != -1) {
              console.info(`preIndex: ${this.preIndex}, index: ${item.id}, black`)
              var innerEvent = { eventId: this.preIndex }
              // 取消選中態(tài):紅變黑
              var eventData = {
                data: {
                  "colorTag": 0
                }
              }
              emitter.emit(innerEvent, eventData)
            }
            this.preIndex = item.id
          })

        }, (item: ViewData) => JSON.stringify(item))
      }.columnsTemplate('1fr 1fr')
    }

  }
}

@Component
export struct TapImage {
  @State tapColor: Color = Color.Black;
  private index: number;
  private uri: Resource;

  onTapIndexChange(colorTag: emitter.EventData) {
    this.tapColor = colorTag.data.colorTag ? Color.Red : Color.Black
  }

  aboutToAppear() {
    //定義事件ID
    var innerEvent = { eventId: this.index }
    emitter.on(innerEvent, this.onTapIndexChange.bind(this))
  }

  build() {
    Column() {
      Image(this.uri)
        .objectFit(ImageFit.Cover)
        .border({ width: 5, style: BorderStyle.Dotted, color: this.tapColor })
    }
  }
}

以下示例為消息機制方式訂閱事件,會導(dǎo)致回調(diào)監(jiān)聽的節(jié)點數(shù)較多,非常耗時,不推薦以此來實現(xiàn)應(yīng)用代碼。

// xxx.ets
class ViewData {
  title: string;
  uri: Resource;
  color: Color = Color.Black;

  constructor(title: string, uri: Resource) {
    this.title = title;
    this.uri = uri
  }
}

@Entry
@Component
struct Gallery2 {
  dataList: Array<ViewData> = [new ViewData('flower', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon')), new ViewData('OMG', $r('app.media.icon'))]
  scroller: Scroller = new Scroller()

  build() {
    Column() {
      Grid(this.scroller) {
        ForEach(this.dataList, (item: ViewData, index?: number) => {
          GridItem() {
            TapImage({
              uri: item.uri,
              index: index
            })
          }.aspectRatio(1)

        }, (item: ViewData, index?: number) => {
          return JSON.stringify(item) + index;
        })
      }.columnsTemplate('1fr 1fr')
    }

  }
}

@Component
export struct TapImage {
  @StorageLink('tapIndex') @Watch('onTapIndexChange') tapIndex: number = -1;
  @State tapColor: Color = Color.Black;
  private index: number;
  private uri: Resource;

  // 判斷是否被選中
  onTapIndexChange() {
    if (this.tapIndex >= 0 && this.index === this.tapIndex) {
      console.info(`tapindex: ${this.tapIndex}, index: ${this.index}, red`)
      this.tapColor = Color.Red;
    } else {
      console.info(`tapindex: ${this.tapIndex}, index: ${this.index}, black`)
      this.tapColor = Color.Black;
    }
  }

  build() {
    Column() {
      Image(this.uri)
        .objectFit(ImageFit.Cover)
        .onClick(() => {
          this.tapIndex = this.index;
        })
        .border({ width: 5, style: BorderStyle.Dotted, color: this.tapColor })
    }

  }
}

限制條件

AppStorage與PersistentStorage以及Environment配合使用時,需要注意以下幾點:文章來源地址http://www.zghlxwxcb.cn/news/detail-829705.html

  • 在AppStorage中創(chuàng)建屬性后,調(diào)用PersistentStorage.PersistProp()接口時,會使用在AppStorage中已經(jīng)存在的值,并覆蓋PersistentStorage中的同名屬性,所以建議要使用相反的調(diào)用順序;
  • 如果在AppStorage中已經(jīng)創(chuàng)建屬性后,再調(diào)用Environment.EnvProp()創(chuàng)建同名的屬性,會調(diào)用失敗。因為AppStorage已經(jīng)有同名屬性,Environment環(huán)境變量不會再寫入AppStorage中,所以建議AppStorage中屬性不要使用Environment預(yù)置環(huán)境變量名。

到了這里,關(guān)于HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—學(xué)習(xí)ArkTS語言(狀態(tài)管理 六)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—學(xué)習(xí)ArkTS語言(基本語法 五)

    HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—學(xué)習(xí)ArkTS語言(基本語法 五)

    如果每個組件的樣式都需要單獨設(shè)置,在開發(fā)過程中會出現(xiàn)大量代碼在進(jìn)行重復(fù)樣式設(shè)置,雖然可以復(fù)制粘貼,但為了代碼簡潔性和后續(xù)方便維護(hù),我們推出了可以提煉公共樣式進(jìn)行復(fù)用的裝飾器@Styles。 @Styles裝飾器可以將多條樣式設(shè)置提煉成一個方法,直接在組件聲明的位

    2024年02月17日
    瀏覽(24)
  • HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—學(xué)習(xí)ArkTS語言(基本語法 二)

    在ArkUI中,UI顯示的內(nèi)容均為組件,由框架直接提供的稱為系統(tǒng)組件,由開發(fā)者定義的稱為自定義組件。在進(jìn)行 UI 界面開發(fā)時,通常不是簡單的將系統(tǒng)組件進(jìn)行組合使用,而是需要考慮代碼可復(fù)用性、業(yè)務(wù)邏輯與UI分離,后續(xù)版本演進(jìn)等因素。因此,將UI和部分業(yè)務(wù)邏輯封裝成

    2024年02月04日
    瀏覽(65)
  • HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—方舟開發(fā)框架(ArkUI)概述

    HarmonyOS學(xué)習(xí)路之方舟開發(fā)框架—方舟開發(fā)框架(ArkUI)概述

    方舟開發(fā)框架(簡稱ArkUI)為HarmonyOS應(yīng)用的UI開發(fā)提供了完整的基礎(chǔ)設(shè)施,包括簡潔的UI語法、豐富的UI功能(組件、布局、動畫以及交互事件),以及實時界面預(yù)覽工具等,可以支持開發(fā)者進(jìn)行可視化界面開發(fā)。 UI: 即用戶界面。開發(fā)者可以將應(yīng)用的用戶界面設(shè)計為多個功能

    2024年02月16日
    瀏覽(96)
  • HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(動畫開發(fā))

    HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(動畫開發(fā))

    動畫是組件的基礎(chǔ)特性之一,精心設(shè)計的動畫使UI變化更直觀,有助于改進(jìn)應(yīng)用程序的外觀并改善用戶體驗。Java UI框架提供了幀動畫、數(shù)值動畫和屬性動畫,并提供了將多個動畫同時操作的動畫集合。 幀動畫是利用視覺暫留現(xiàn)象,將一系列靜止的圖片按序播放,給用戶產(chǎn)生動

    2024年02月09日
    瀏覽(87)
  • HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(TableLayout)

    HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(TableLayout)

    TableLayout使用表格的方式劃分子組件。 TableLayout的共有XML屬性繼承自:Component TableLayout的自有XML屬性見下表: 屬性名稱 中文描述 取值 取值說明 使用案例 alignment_type 對齊方式 align_edges 表示TableLayout內(nèi)的組件按邊界對齊。 ohos:alignment_type=\\\"align_edges\\\" align_contents 表示TableLayout內(nèi)的

    2024年02月09日
    瀏覽(15)
  • HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(PositionLayout&&AdaptiveBoxLayout)

    HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(PositionLayout&&AdaptiveBoxLayout)

    在PositionLayout中,子組件通過指定準(zhǔn)確的x/y坐標(biāo)值在屏幕上顯示。(0, 0)為左上角;當(dāng)向下或向右移動時,坐標(biāo)值變大;允許組件之間互相重疊。 PositionLayout示意圖 PositionLayout以坐標(biāo)的形式控制組件的顯示位置,允許組件相互重疊。 在layout目錄下的XML文件中創(chuàng)建PositionLayout并添

    2024年02月09日
    瀏覽(20)
  • HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(自定義組件與布局 一)

    HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(自定義組件與布局 一)

    HarmonyOS提供了一套復(fù)雜且強大的Java UI框架,其中Component提供內(nèi)容顯示,是界面中所有組件的基類。ComponentContainer作為容器容納Component或ComponentContainer對象,并對它們進(jìn)行布局。 Java UI框架也提供了一部分Component和ComponentContainer的具體子類,即常用的組件(比如:Text、Button、

    2024年02月09日
    瀏覽(14)
  • HarmonyOS學(xué)習(xí) -- ArkTS開發(fā)語言入門

    HarmonyOS學(xué)習(xí) -- ArkTS開發(fā)語言入門

    ArkTS是HarmonyOS主力應(yīng)用開發(fā)語言。它在TypeScript(簡稱TS)的基礎(chǔ)上,匹配ArkUI框架,擴展了聲明式UI、狀態(tài)管理等相應(yīng)的能力,讓開發(fā)者以更簡潔、更自然的方式開發(fā)跨端應(yīng)用。 JavaScript是一種屬于網(wǎng)絡(luò)的高級腳本語言,已經(jīng)被廣泛應(yīng)用開發(fā),常用來為網(wǎng)頁添加各式各樣的動態(tài)

    2024年02月08日
    瀏覽(28)
  • HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(JS FA調(diào)用Java PA)

    HarmonyOS學(xué)習(xí)路之開發(fā)篇—Java UI框架(JS FA調(diào)用Java PA)

    使用兼容JS的類Web開發(fā)范式的方舟開發(fā)框架提供了JS FA(Feature Ability)調(diào)用Java PA(Particle Ability)的機制,該機制提供了一種通道來傳遞方法調(diào)用、處理數(shù)據(jù)返回以及訂閱事件上。 當(dāng)前提供Ability和Internal Ability兩種調(diào)用方式。 Ability:擁有獨立的Ability生命周期,F(xiàn)A使用遠(yuǎn)端進(jìn)程

    2024年02月09日
    瀏覽(17)
  • HarmonyOS北向開發(fā)(軟件開發(fā)方向)基于ArkTS 入門學(xué)習(xí) (1) - 開發(fā)語言及環(huán)境配置

    HarmonyOS北向開發(fā)(軟件開發(fā)方向)基于ArkTS 入門學(xué)習(xí) (1) - 開發(fā)語言及環(huán)境配置

    ? ? ? ? 建議快速閱讀一遍,不要求記住。知道一個大概框架即可,方便以后查閱開發(fā)文檔 開發(fā)語言 - ArkTS ?????????HarmonyOS主要的開發(fā)語言 ? ? ? ? ????????未來版本的HarmonyOS的主要開發(fā)語言將會是ArkTS,在Devco Studio創(chuàng)建項目的時候,選擇API 9 開發(fā)的情況下,只能使

    2024年01月21日
    瀏覽(33)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包