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

鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解

這篇具有很好參考價值的文章主要介紹了鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?經(jīng)歷的越多,越喜歡簡單的生活,干凈的東西,清楚的感覺,有結(jié)果的事,和說到做到的人。把圈子變小,把語放緩,把心放寬,用心做好手邊的事兒,該有的總會有的!

目錄

一,定義

二,裝飾器說明

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

?四,使用

1,簡單對象的使用

2,嵌套對象的使用

3,數(shù)組對象的使用

一,定義

之前所講的裝飾器僅能觀察到第一層的變化,但是在實際應(yīng)用開發(fā)中,應(yīng)用會根據(jù)開發(fā)需要,封裝自己的數(shù)據(jù)模型。對于多層嵌套的情況,比如二維數(shù)組,或者數(shù)組項class,或者class的屬性是class,他們的第二層的屬性變化是無法觀察到的。這就引出了@Observed/@ObjectLink裝飾器。

@ObjectLink和@Observed類裝飾器用于在涉及嵌套對象或數(shù)組的場景中進行雙向數(shù)據(jù)同步:

①被@Observed裝飾的類,可以被觀察到屬性的變化;

②子組件中@ObjectLink裝飾器裝飾的狀態(tài)變量用于接收@Observed裝飾的類的實例,和父組件中對應(yīng)的狀態(tài)變量建立雙向數(shù)據(jù)綁定。這個實例可以是數(shù)組中的被@Observed裝飾的項,或者是class object中的屬性,這個屬性同樣也需要被@Observed裝飾。

③單獨使用@Observed是沒有任何作用的,需要搭配@ObjectLink或者@Prop使用。

限制條件:

①使用@Observed裝飾class會改變class原始的原型鏈,@Observed和其他類裝飾器裝飾同一個class可能會帶來問題。

②@ObjectLink裝飾器不能在@Entry裝飾的自定義組件中使用。

二,裝飾器說明

@Observed類裝飾器 說明
裝飾器參數(shù)
類裝飾器 裝飾class。需要放在class的定義前,使用new創(chuàng)建類對象。
@ObjectLink變量裝飾器 說明
裝飾器參數(shù)
同步類型 不與父組件中的任何類型同步變量。
允許裝飾的變量類型 必須為被@Observed裝飾的class實例,必須指定類型。
不支持簡單類型,可以使用@Prop。
支持繼承Date或者Array的class實例
@ObjectLink的屬性是可以改變的,但是變量的分配是不允許的,也就是說這個裝飾器裝飾變量是只讀的,不能被改變。
被裝飾變量的初始值 不允許。

!注意:

@ObjectLink裝飾的變量不能被賦值,如果要使用賦值操作,請使用@Prop。

①@Prop裝飾的變量和數(shù)據(jù)源的關(guān)系是單向同步,@Prop裝飾的變量在本地拷貝了數(shù)據(jù)源,所以它允許本地更改,如果父組件中的數(shù)據(jù)源有更新,@Prop裝飾的變量本地的修改將被覆蓋;

②@ObjectLink裝飾的變量和數(shù)據(jù)源的關(guān)系是雙向同步,@ObjectLink裝飾的變量相當(dāng)于指向數(shù)據(jù)源的指針。禁止對@ObjectLink裝飾的變量賦值,如果一旦發(fā)生@ObjectLink裝飾的變量的賦值,則同步鏈將被打斷。因為@ObjectLink修飾的變量通過數(shù)據(jù)源(Object)引用來初始化。對于實現(xiàn)雙向數(shù)據(jù)同步的@ObjectLink,賦值相當(dāng)于更新父組件中的數(shù)組項或者class的屬性,TypeScript/JavaScript不能實現(xiàn),會發(fā)生運行時報錯。

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

@ObjectLink傳遞/訪問 說明
從父組件初始化 必須指定。
初始化@ObjectLink裝飾的變量必須同時滿足以下場景:
-?類型必須是@Observed裝飾的class。
-?初始化的數(shù)值需要是數(shù)組項,或者class的屬性。
-?同步源的class或者數(shù)組必須是@State,@Link,@Provide,@Consume或者@ObjectLink裝飾的數(shù)據(jù)。
與源對象同步 雙向。
可以初始化子組件 允許,可用于初始化常規(guī)變量、@State、@Link、@Prop、@Provide

?四,使用

注意,@Observed必須在ets文件中使用,在ts文件中不允許使用

1,簡單對象的使用

用@Observed裝飾數(shù)據(jù)類

@Observed
export default class YuanZhen {

  public name: string = 'YuanZhen';

  public age: number = 18;

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}

子組件

import YuanZhen from './bean/YuanZhen'

@Component
export default struct ProvideTest {

  @ObjectLink yuanZhen:YuanZhen

  build() {
    Row() {
      Column() {
        Text("子name:" + this.yuanZhen.name+"\nage:"+this.yuanZhen.age)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuanZhen.name ="袁震2"
            this.yuanZhen.age=35
          })
      }.width('100%')
    }.height('100%')
  }

}

父組件

import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {

  @State yuan:YuanZhen=new YuanZhen("袁震",18)

  build() {
    Column(){
      Text("父name:" + this.yuan.name+"\nage:"+this.yuan.age)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan.name ="袁震1"
          this.yuan.age =20
        })
      ProvideTest({yuanZhen:this.yuan})
    }
  }

}

注意:這里會有一個報錯,Assigning the '@State' decorated attribute 'yuan' to the '@ObjectLink' decorated attribute 'yuanZhen' is not allowed. <ArkTSCheck> 是編譯器的問題,但是不影響使用

運行效果:

鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊父鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊子鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙

所以,?被@Observed和@ObjectLink修飾的class可以實現(xiàn)父子雙向綁定

2,嵌套對象的使用

用@Observed修飾的數(shù)據(jù)類:

@Observed
export default class YuanZhen {

  public name: string = 'YuanZhen';

  public age: number = 18;

  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}
import YuanZhen from './YuanZhen';
@Observed
export default class Yuan {

  public number: number = 1;
  public yuanZhen: YuanZhen = new YuanZhen('yuanzhen', 18);

  constructor(number: number, yuanZhen: YuanZhen) {
    this.number = number
    this.yuanZhen = yuanZhen
  }
}

子組件:

import YuanZhen from './bean/YuanZhen'

@Component
export default struct ProvideTest {

  @ObjectLink yuanZhen:YuanZhen

  build() {
    Row() {
      Column() {
        Text("子name:" + this.yuanZhen.name+"\nage:"+this.yuanZhen.age)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuanZhen.name ="袁震2"
            this.yuanZhen.age=35
          })
      }.width('100%')
    }.height('100%')
  }
}

父組件:

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {

  @State yuan:Yuan=new Yuan(1,new YuanZhen("袁震",18))

  build() {
    Column(){
      Text("父name:" + this.yuan.yuanZhen.name+"\nage:"+this.yuan.yuanZhen.age)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan.yuanZhen.name ="袁震1"
          this.yuan.yuanZhen.age =20
          console.info("yz----name="+this.yuan.yuanZhen.name )
        })
      ProvideTest({yuanZhen:this.yuan.yuanZhen})
    }
  }
}

運行:

鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊父鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊子鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙

點擊父組件,輸出:鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙

由此可見,當(dāng)class為嵌套類型時,父組件的UI不會改變,但是數(shù)據(jù)會改變,子組件的UI和數(shù)據(jù)都會改變

3,數(shù)組對象的使用

子組件

import Yuan from './bean/Yuan'


@Component
export default struct ProvideTest {

  @ObjectLink yuan:Yuan

  build() {
    Row() {
      Column() {
        Text("子name:"+this.yuan.yuanZhen.name+"\nage:"+this.yuan.yuanZhen.age+"\nnumber:"+this.yuan.number)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuan.yuanZhen.name ="袁震子組件"
            this.yuan.yuanZhen.age=35
            console.log("yz---name:"+this.yuan.yuanZhen.name)
          })
      }.width('100%')
    }.height('100%')
  }
}

父組件

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {
  @State yuan:Array<Yuan>=new Array

  aboutToAppear(){
    let yuan1:Yuan =new Yuan(1,new YuanZhen("袁震1",18))
    let yuan2:Yuan =new Yuan(2,new YuanZhen("袁震2",19))
    let yuan3:Yuan =new Yuan(3,new YuanZhen("袁震3",20))
    this.yuan.push(yuan1)
    this.yuan.push(yuan2)
    this.yuan.push(yuan3)
  }

  build() {
    Column(){
      Text("父name:" + this.yuan[0].yuanZhen.name+"\nage:"+this.yuan[0].yuanZhen.age+"\nnumber:"+this.yuan[0].number)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan[0].yuanZhen.name="袁震父組件"
          this.yuan[0].number =10
          this.yuan[0].yuanZhen.age=30
        })
      ProvideTest({yuan:this.yuan[0]})
    }
  }

}

運行:

鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊父鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊子鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙

可以看到,父組件不會更新本身的UI,會更新子組件的UI,子組件既不會更新自己的UI也不會更新父組件的UI。

但是,可以直接傳給子組件簡單類,這樣可以更新子組件

子組件?

import YuanZhen from './bean/YuanZhen'

@Component
export default struct ProvideTest {

  @ObjectLink yuanZhen:YuanZhen

  build() {
    Row() {
      Column() {
        Text("子name:"+this.yuanZhen.name+"\nage:"+this.yuanZhen.age)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            this.yuanZhen.name ="袁震子組件"
            this.yuanZhen.age=35
            console.log("yz---name:"+this.yuanZhen.name)
          })
      }.width('100%')
    }.height('100%')
  }
}

父組件

import Yuan from './bean/Yuan';
import YuanZhen from './bean/YuanZhen';
import ProvideTest from './ProvideTest';

@Entry
@Component
struct Index {
  @State yuan:Array<Yuan>=new Array

  aboutToAppear(){
    let yuan1:Yuan =new Yuan(1,new YuanZhen("袁震1",18))
    let yuan2:Yuan =new Yuan(2,new YuanZhen("袁震2",19))
    let yuan3:Yuan =new Yuan(3,new YuanZhen("袁震3",20))
    this.yuan.push(yuan1)
    this.yuan.push(yuan2)
    this.yuan.push(yuan3)
  }

  build() {
    Column(){
      Text("父name:" + this.yuan[0].yuanZhen.name+"\nage:"+this.yuan[0].yuanZhen.age+"\nnumber:"+this.yuan[0].number)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          this.yuan[0].yuanZhen.name="袁震父組件"
          this.yuan[0].number =10
          this.yuan[0].yuanZhen.age=30
        })
      ProvideTest({yuanZhen:this.yuan[0].yuanZhen})
    }
  }

}

鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊父鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙點擊子鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解,鴻蒙開發(fā),harmonyos,鴻蒙

父組件的ui不會改變,子組件的UI會實時更新文章來源地址http://www.zghlxwxcb.cn/news/detail-790099.html

到了這里,關(guān)于鴻蒙Harmony--狀態(tài)管理器-@Observed裝飾器和@ObjectLink裝飾器詳解的文章就介紹完了。如果您還想了解更多內(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īng)查實,立即刪除!

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

相關(guān)文章

  • 鴻蒙Harmony--狀態(tài)管理器--@Prop詳解

    鴻蒙Harmony--狀態(tài)管理器--@Prop詳解

    縱橫千里獨行客,何懼前路雨瀟瀟。夜半濁酒慰寂寞,天明走馬入紅塵。且將新火試新茶,詩酒趁年華。青春以末,壯志照舊,生活以悟,前路未明。時間善變,可執(zhí)著翻不了篇。時光磨我少年心,卻難滅我少年志,壯士活古不活皮。加油。 目錄 一,定義 二,裝飾器使用規(guī)

    2024年02月01日
    瀏覽(48)
  • 鴻蒙Harmony--LocalStorage--頁面級UI狀態(tài)存儲詳解

    鴻蒙Harmony--LocalStorage--頁面級UI狀態(tài)存儲詳解

    走的太急疼的是腳,逼的太緊累的是心,很多時候,慢一點也沒關(guān)系,多給自己一些耐心和等待,保持熱愛,當(dāng)下即是未來,生活自有安排!? 目錄 一,定義 二,@LocalStorageProp定義 三,@LocalStorageProp裝飾器使用規(guī)則說明 ?四,@LocalStorageProp變量的傳遞/訪問規(guī)則說明 ?五,@Loc

    2024年01月20日
    瀏覽(24)
  • 鴻蒙Harmony--AppStorage--應(yīng)用全局的UI狀態(tài)存儲詳解

    鴻蒙Harmony--AppStorage--應(yīng)用全局的UI狀態(tài)存儲詳解

    ?無所求必滿載而歸,當(dāng)你降低期待,降低欲望,往往會得到比較好的結(jié)果,把行動交給現(xiàn)在,用心甘情愿的態(tài)度,過隨遇而安的生活,無論結(jié)果如何,都是一場驚喜的獲得! 目錄 一,定義 二,@StorageProp定義 三,@StorageProp裝飾器使用規(guī)則說明 四,變量的傳遞/訪問規(guī)則說明

    2024年01月17日
    瀏覽(19)
  • 鴻蒙Harmony-PersistentStorage--持久化存儲UI狀態(tài)儲詳解

    鴻蒙Harmony-PersistentStorage--持久化存儲UI狀態(tài)儲詳解

    用簡單的心境,對待復(fù)雜的人生,方能看淡得失,從容入世,瀟灑自如,心變得簡單了,世界也就簡單了 目錄 一,定義 二,限制條件 三,使用 LocalStorage和AppStorage都是運行時的內(nèi)存,但是在應(yīng)用退出再次啟動后,依然能保存選定的結(jié)果,是應(yīng)用開發(fā)中十分常見的現(xiàn)象,這就

    2024年01月18日
    瀏覽(18)
  • 系統(tǒng)學(xué)習(xí)Python——裝飾器:類裝飾器-[初探類裝飾器和元類]

    分類目錄:《系統(tǒng)學(xué)習(xí)Python》總目錄 函數(shù)裝飾器是如此有用,以至于Python2.X和Python3.X都擴展了這一模式,允許裝飾器應(yīng)用于類和函數(shù)。簡而言之,類裝飾器類似于函數(shù)裝飾器,但它們是在一條 class 語句的末尾運行,并把一個類名重新綁定到一個可調(diào)用對象。同樣,它們可以

    2024年02月19日
    瀏覽(21)
  • 愜意上手Python —— 裝飾器和內(nèi)置函數(shù)

    愜意上手Python —— 裝飾器和內(nèi)置函數(shù)

    ?Python中的裝飾器是一種特殊類型的函數(shù),它允許用戶在不修改原函數(shù)代碼的情況下,增加或修改函數(shù)的行為。 具體來說, 裝飾器的工作原理基于Python的函數(shù)也是對象這一事實,可以被賦值給變量、作為參數(shù)傳遞給其他函數(shù)或者作為其他函數(shù)的返回值。裝飾器通常接受一個函

    2024年01月24日
    瀏覽(19)
  • 鴻蒙開發(fā)之狀態(tài)管理

    鴻蒙開發(fā)之狀態(tài)管理

    @State裝飾的變量,會和自定義組件的渲染綁定起來。當(dāng)狀態(tài)改變時,UI會發(fā)生對應(yīng)的渲染改變。 在狀態(tài)變量相關(guān)裝飾器中,@State是最基礎(chǔ)的,使變量擁有狀態(tài)屬性的裝飾器,它也是大部分狀態(tài)變量的數(shù)據(jù)源。 裝飾器使用規(guī)則 同步類型:不與父組件中任何類型的變量同步。 允

    2024年01月20日
    瀏覽(43)
  • 【鴻蒙系統(tǒng)學(xué)習(xí)筆記】狀態(tài)管理

    【鴻蒙系統(tǒng)學(xué)習(xí)筆記】狀態(tài)管理

    資料來自官網(wǎng):文檔中心 在聲明式UI編程框架中,UI是程序狀態(tài)的運行結(jié)果,用戶構(gòu)建了一個UI模型,其中應(yīng)用的運行時的狀態(tài)是參數(shù)。當(dāng)參數(shù)改變時,UI作為返回結(jié)果,也將進行對應(yīng)的改變。這些運行時的狀態(tài)變化所帶來的UI的重新渲染,在ArkUI中統(tǒng)稱為狀態(tài)管理機制。 View

    2024年02月21日
    瀏覽(20)
  • 鴻蒙開發(fā)系列教程(七)--ArkTS語言:狀態(tài)管理

    鴻蒙開發(fā)系列教程(七)--ArkTS語言:狀態(tài)管理

    如果希望構(gòu)建一個動態(tài)的、有交互的界面,就需要引入“狀態(tài)”的概念 狀態(tài)管理機制:在聲明式UI編程框架中,UI是程序狀態(tài)的運行結(jié)果,用戶構(gòu)建了一個UI模型,其中應(yīng)用的運行時的狀態(tài)是參數(shù)。當(dāng)參數(shù)改變時,UI作為返回結(jié)果,也將進行對應(yīng)的改變。這些運行時的狀態(tài)變化

    2024年01月20日
    瀏覽(18)
  • 【HarmonyOS】鴻蒙開發(fā)之狀態(tài)管理——第2.2章

    ArkUI 開發(fā)提供了多維度的狀態(tài)管理機制。狀態(tài)管理機制能使父子組件之間,爺孫組件之間數(shù)值傳遞,還可以跨設(shè)備傳遞。從數(shù)據(jù)的傳遞形式看,可以分為只讀的單向傳遞和可變更的雙向傳遞。與vue的用法特別像。 @State 有以下特征: 支持多種數(shù)據(jù)類型: class number boolean string 強類

    2024年02月21日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包