国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)

開發 前端
本文就為大家介紹如何配合使用@State、@Observed、@ObjectLink三個裝飾器監聽多層狀態變化。本例最終實現效果為:將工程資源文件中png格式的圖片轉換為jpg格式,并保存在設備中。由于本例不涉及UI講解,所以不在此提供UI效果。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

如何監聽多層狀態變化

場景說明

應用開發過程中,當希望通過狀態變量控制頁面刷新時,大家通常想到的就是裝飾器@State,但是在嵌套場景下,單單使用@State并不能監聽到變量的狀態變化,這就引出了@Observed/@ObjectLink裝飾器。本文就為大家介紹如何配合使用@State、@Observed、@ObjectLink三個裝飾器監聽多層狀態變化。

概念原理

在講解具體操作前,大家先理解以下幾個概念:

  • 第一層狀態變化:指不包含嵌套關系的變量的變化,比如string、number、boolean等基礎數據類型的狀態變化,以及嵌套結構中第一層變量的狀態變化。
  • 多層狀態變化:指包含嵌套關系的二層及以下變量的變化,比如嵌套類中被嵌套類的成員變量的狀態變化,嵌套數組中被嵌套數組的狀態變化等。

第一層變量的狀態變化可以用@State監聽,二層及以下變量的狀態變化則需要使用@Observed/@ObjectLink監聽。以嵌套結構舉例,如下圖:

如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區

為便于理解,通過以下例子具體說明單層和多層狀態變化:

class ClassB {
  public c: number;

  constructor(c: number) {
    this.c = c;
  }
}

class ClassA {
  // ClassB成員變量的類型為ClassA,ClassA為被嵌套類
  public b: ClassB;

  constructor(b: ClassB) {
    this.b = b;
  }
}

a: ClassA
// 變量b為ClassA的成員變量,為第一層變量,所以變量b的狀態變化即為第一層狀態變化
this.a.b = new ClassB(0)
// 變量c為被嵌套類ClassB的成員變量,變量c的狀態變化即為第二層狀態變化
this.a.b.c = 5

監聽第一層狀態變化

監聽第一層狀態變化可以使用@State修飾變量,變量發生變化后即可同步刷新UI,這是大家最常用的場景,為便于理解,此處舉例說明一下:

class ClassA {
  public a:number

  constructor(a:number) {
    this.a = a;
  }
}

@Entry
@Component
struct ViewA {
  // 使用@State修飾變量class_A,以監聽其變化
  @State class_A: ClassA = new ClassA(0);

  build() {
    Column() {
      Row(){
        Button(`第一層變量+1`)
          .margin({top:10,right:20})
          .backgroundColor('#E8A027')
          .onClick(() => {
            // class_A的成員變量a加1,class_A發生變化
            this.class_A.a += 1;
          })
        // 將第一層變量在UI呈現出來
        Text(`${this.class_A.a}`)
      }
      .margin({top:50})

      Row(){
        Button(`第一層變量變為2`)
          .margin({top:10,right:20})
          .onClick(() => {
            // 將新的ClassA實例賦值給class_A,class_A發生變化
            this.class_A = new ClassA(2);
          })
        // 將第一層變量在UI呈現出來
        Text(`${this.class_A.a}`)
      }
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

效果如下,如圖可以看出第一層變量發生變化后可以實時在UI呈現出來,所以@State可以有效的監聽第一層變量的狀態變化:

如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區

監聽多層狀態變化

接下來,我們介紹如何使用@Observed/@ObjectLink監聽多層狀態變化。
在第一層狀態監聽的基礎上我們引入ClassB,構造一個嵌套結構,從而具有多層變量,如下:

// 引入ClassB
class ClassB {
  public b: number;

  constructor(b: number) {
    this.b = b;
  }
}


class ClassA {
  // ClassA成員變量a的類型為ClassB,從而形成嵌套結構,ClassB的成員變量b為第二層變量
  public a:ClassB

  constructor(a:ClassB) {
    this.a = a;
  }
}

此時我們可以驗證一下,如果僅使用@State是否可以監聽到第二層變量的變化:

// 引入ClassB
class ClassB {
  public b: number;

  constructor(b: number) {
    this.b = b;
  }
}

class ClassA {
  // ClassA成員變量a的類型為ClassB,從而形成嵌套結構,ClassB的成員變量b為第二層變量
  public a:ClassB

  constructor(a:ClassB) {
    this.a = a;
  }
}

@Entry
@Component
struct ViewA {
  // 使用@State修飾變量class_A
  @State class_A: ClassA = new ClassA(new ClassB(0));

  build() {
    Column() {
      Row(){
        // 點擊按鈕,第二層變量發生變化
        Button('第二層變量+1')
          .margin({top:10,right:20})
          .backgroundColor('#E8A027')
          .onClick(() => {
            // 第二層變量變化,嵌套類ClassB的成員變量b加1
            this.class_A.a.b += 1;
          })
        // 將第二層變量在UI呈現出來
        Text(`${this.class_A.a.b}`)
      }
      .margin({top:50})
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

效果如下,可以看出當第二層變量發生變化時,UI沒有任何變化,所以單純使用@State不能監聽到二層及以下變量的變化:

如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區

接下來我們使用@Observed/@ObjectLink監聽本例中第二層變量的變化。
根據使用規則,需要使用@Observed修飾嵌套類,使用@ObjectLink修飾嵌套類的實例,且@ObjectLink不能在被@Entry修飾的組件中使用,所以我們構建一個子組件,然后在父組件中進行引用,具體代碼如下:

// 使用@Observed修飾ClassB
@Observed
class ClassB {
  public b: number;

  constructor(b: number) {
    this.b = b;
  }
}

class ClassA {
  // ClassA成員變量a的類型為ClassB,從而形成嵌套結構,ClassB的成員變量b為第二層變量
  public a:ClassB

  constructor(a:ClassB) {
    this.a = a;
  }
}

// 構建子組件ViewB用于承載@ObjectLink修飾的變量
@Component
struct ViewB {
  // 使用@ObjectLink修飾ClassB的實例class_B
  @ObjectLink class_B: ClassB;
  build() {
    Row() {
      // 將ClassB的成員變量b在UI呈現出來
      Text(`${this.class_B.b}`)
    }
    .margin({top:100})
  }
}

@Entry
@Component
struct ViewA {
  @State class_A: ClassA = new ClassA(new ClassB(0));

  build() {
    Column() {
      ViewB({ class_B: this.class_A.a })
      Row(){
        // 點擊按鈕,第二層變量發生變化
        Button('第二層變量class_B.b加1')
          .margin({top:10,right:20})
          .backgroundColor('#E8A027')
          .onClick(() => {
            // 第二層變量變化,嵌套類ClassB的成員變量b加1
            this.class_A.a.b += 1;
          })
      }
      .margin({top:50})
    }
    .width('100%')
    .justifyContent(FlexAlign.Center)
  }
}

我們來看下效果:

如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區如何監聽多層狀態的變化(使用@State、@Observed、@ObjectLink裝飾器)-開源基礎軟件社區

如圖,現在當二層變量發生變化時,可以完美的被監聽到,并在UI中刷新出來了。

當然,嵌套數組等也是同樣的原理,大家可以參考官方指南進行嘗試。

想了解更多關于開源的內容,請訪問:

51CTO 開源基礎軟件社區

https://ost.51cto.com

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區
相關推薦

2010-02-01 17:50:32

Python裝飾器

2022-09-14 08:16:48

裝飾器模式對象

2023-08-10 17:23:39

2022-05-10 09:12:16

TypeScript裝飾器

2023-12-01 14:57:22

TCP連接

2023-12-14 08:25:14

WatchVue.js監聽數據

2022-09-19 23:04:08

Python裝飾器語言

2023-11-29 16:29:09

線程java

2025-01-22 15:58:46

2024-09-12 15:32:35

裝飾器Python

2015-01-06 09:11:54

TCP

2024-11-04 15:30:43

Python裝飾器函數

2015-08-07 15:42:21

網絡監聽源碼

2021-09-03 08:23:21

Vue 插槽子組件

2009-12-25 18:12:43

WPF裝飾器

2016-11-01 09:24:38

Python裝飾器

2023-02-07 07:47:52

Python裝飾器函數

2023-01-06 08:55:00

2023-10-26 07:15:46

2025-05-29 01:00:00

文件監聽函數
點贊
收藏

51CTO技術棧公眾號

97久久超碰福利国产精品…| 2001个疯子在线观看| 日韩欧美在线观看一区二区三区| 久久九九精品视频| 亚洲熟妇国产熟妇肥婆| 在线观看视频一区| 99久久综合| 欧美韩国日本在线| www.xxxx欧美| 91亚洲精华国产精华精华液| 欧美aa一级| 男女啪啪免费观看| 日韩在线观看av| 久久一区二区三区国产精品| 亚洲妇女成熟| 欧美人成在线观看| 欧美精品乱码久久久久久| 国产高清欧美| 4虎在线播放1区| 7777精品视频| 亚洲激情第一区| 91久久黄色| 在线观看一级片| 国产91精品入口17c| 欧美三级日韩三级国产三级| 三级欧美在线一区| 欧美黄色网页| 日韩av在线中文| 国产综合香蕉五月婷在线| 欧美精品久久久久久久多人混战 | 青青青草视频在线| 亚洲色成人www永久在线观看 | 亚洲一区免费视频| 美女一区二区久久| 最新国产一区| av资源在线播放| 国产无套内射久久久国产| 国产精品美女网站| 亚洲人成在线观看| 开心丁香婷婷深爱五月| 国产剧情在线观看一区二区| 外国成人直播| 男人艹女人网站| 欧美亚洲在线视频| 日韩欧美国产综合在线一区二区三区| 91麻豆国产在线观看| 欧美影院三区| 伊人久久亚洲| aa国产成人| 天堂在线免费av| 日本精品一区在线观看| 国产精品18久久久久久麻辣| 亚洲成在人线av| 91成人看片片| 亚洲精品国久久99热| 成人午夜电影网站| 亚洲国产二区| 国产一区二区精品福利地址| 91白丝在线| 成人黄动漫网站| 手机在线视频你懂的| 国内自拍欧美激情| 久久精品视频网站| 在线免费av一区| 亚洲国产精品自拍| 自拍av一区二区三区| 国产精品1024| 国产成人免费av在线| 亚洲一区二区三区免费在线观看| 欧美欧美黄在线二区| 欧美一级片网址| sqte在线播放| 精品视频二区| 欧美激情二区| 欧美性天天影视| 国产精品影院在线| 91吃瓜网在线观看| 26uuu亚洲电影在线观看| 青青视频在线观| 在线观看免费高清完整| 男人天堂资源在线| 国产在线精品91| 国产一二三区av| 友田真希在线| 在线观看视频污| 欧美欧美欧美| 亚洲欧美成人影院| 自拍在线观看| 2021天堂中文幕一二区在线观| 亚洲最新无码中文字幕久久| 麻豆网站在线看| 欧洲中文在线| 国产一区二区三区视频在线| 亚洲国产欧美国产第一区| 91精品入口| 视频国产一区| 久久精品综合| 国产精品乡下勾搭老头1| 国产日韩三级在线| 国产三级精品三级| 欧美日韩在线播放| 色婷婷综合久久| 亚洲成人在线网| 亚洲欧洲中文天堂| 婷婷五月综合缴情在线视频| 亚洲视频一二三| 国产在线看一区| 国产欧美在线| 成人18视频日本| 亚洲免费视频成人| 日韩亚洲欧美高清| 午夜精品福利在线观看| 国产精品狠色婷| 蜜桃导航-精品导航| 宅男av一区二区三区| 久久精品视频91| 国产超碰精品在线观看| 欧美12一14sex性hd| 国产黄色大片在线观看| 欧美成a人免费观看久久| 日日夜夜精品免费视频| av不卡在线| 亚洲一区在线电影| 欧美一区二区啪啪| 97视频com| av 日韩 人妻 黑人 综合 无码| 一级毛片免费视频| 日韩激情电影| 自拍偷拍欧美| 国产成人精品三级| 午夜精品福利久久久| 在线午夜精品自拍| 日本一区二区在线视频| 日韩一区av| 国产三级精品三级在线观看国产| 亚洲无线视频| 一级中文字幕一区二区| 欧美久久久久久久久中文字幕| 欧美精品一二区| 自拍偷拍99| 青春草免费在线视频| 欧美日本国产| 亚洲一区在线电影| 欧美日本高清一区| 国产69精品久久久久999小说| 婷婷免费在线视频| 国内综合精品午夜久久资源| 亚洲日本一区二区| 91精品国产免费久久久久久| 97成人在线观看视频| 欧美视频第一| 国产精品影视天天线| 日韩精品久久久久久久玫瑰园| 国产精品三区四区| 一二三区在线| 成人一级毛片| 亚洲1区2区3区视频| 91手机视频在线观看| 最新日本视频| 性欧美lx╳lx╳| 欧美日韩一区二区免费在线观看| 国产精品视频xxx| 夜色福利资源站www国产在线视频| 国产精品毛片久久| 高清美女视频一区| 国产超碰在线一区| 久久精品国产一区二区三区 | 国产福利91精品一区二区| 四虎国产精品免费观看| 国产三级久久久| 日韩视频―中文字幕| 久久久久久久久久网| 久久精品超碰| 国产精品的网站| 97精品国产97久久久久久| 中文字幕第88页| 久久久国产精品入口麻豆| 91精品国产欧美日韩| 成年人网站大全| 午夜视频在线观看精品中文| 色婷婷av一区二区三区gif| 国产三级国产精品国产专区50| 日韩一区二区三区高清在线观看| 免费观看在线色综合| 国产精品看片资源| 成人美女大片| 欧美日韩在线观看一区二区| 羞羞视频在线观看免费| 中文字幕亚洲自拍| а天堂中文最新一区二区三区| 久久精品99久久香蕉国产色戒| av网站免费在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产精品一线天粉嫩av| 夫妻av一区二区| 国产一级黄色录像片| 美女少妇全过程你懂的久久| 欧美精品在线观看播放| av在线免费一区| 国产精品水嫩水嫩|