成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何監聽多層狀態的變化(使用@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

裝飾器模式對象

2022-05-10 09:12:16

TypeScript裝飾器

2023-12-01 14:57:22

TCP連接

2023-12-14 08:25:14

WatchVue.js監聽數據

2023-08-10 17:23:39

2023-11-29 16:29:09

線程java

2022-09-19 23:04:08

Python裝飾器語言

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-01-06 08:55:00

2023-02-07 07:47:52

Python裝飾器函數

2023-10-26 07:15:46

2021-11-26 12:00:07

包裝器SwiftU結構體
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品在线视频 | 亚洲一区 | 超碰在线人人 | 天堂色综合 | 密室大逃脱第六季大神版在线观看 | 欧美综合国产精品久久丁香 | 中文字幕日韩欧美 | 亚州午夜精品 | 亚洲精品一区中文字幕乱码 | 国产ts人妖系列高潮 | 91看片免费版 | aaaa网站 | 亚洲一区国产 | 福利视频大全 | 国产一级视频在线播放 | 日韩中文字幕 | 草草视频在线免费观看 | 久久伊人影院 | 九九激情视频 | 久久精品这里精品 | 一区二区三区免费 | 欧美一级视频免费看 | 荷兰欧美一级毛片 | 久久精品国产99国产精品 | 国产成人精品区一区二区不卡 | 国产精品视频97 | 韩国av一区二区 | 国产成人精品免费 | 日韩欧美在线免费观看视频 | 91国在线高清视频 | 成人在线国产 | www..com18午夜观看 | 久草综合在线 | 亚洲欧洲在线观看视频 | 精品久久久久国产 | 成人精品一区二区 | 国产乱一区二区三区视频 | 欧美日韩在线视频一区 | 男人天堂网址 | 四虎永久在线精品免费一区二 | 成年人黄色一级毛片 |