91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS Next V2 @Monitor 和@Computed

萬少 ? 來源:jf_22972444 ? 作者:jf_22972444 ? 2025-04-02 18:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

HarmonyOS Next V2 @Monitor 和@Computed

@Monitor 介紹

@Monitor 是狀態(tài)把管理 V2 版本中的用于監(jiān)聽狀態(tài)變量修改的技術(shù)。

它可以直接用在

  1. @ComponentV2裝飾的自定義組件中,用于被@Local@Param、@Provider@Comsumer、@Computed修飾的狀態(tài)變量中
  2. 對(duì)于深層次的數(shù)據(jù),如深層次對(duì)象、對(duì)象數(shù)組等,需要搭配@ObservedV2、@Trace一起使用。
  3. 可以同時(shí)監(jiān)聽多個(gè)屬性
  4. 可以獲取到監(jiān)聽屬性的修改前后的數(shù)據(jù)變化

對(duì)比狀態(tài)管理 V1 中的@Watch

@Monitor@Watch功能要強(qiáng)大不少

  1. @Watch 不能用在@ComponentV2修飾的
  2. @Watch 不具備深度監(jiān)聽的功能
  3. @Watch 無法同時(shí)監(jiān)聽多個(gè)屬性
  4. @Watch 無法檢測(cè) 屬性修改前后的變化

@Monitor 監(jiān)聽單個(gè)屬性

@Entry
@ComponentV2
struct Index {
  @Local num: number = 100

  @Monitor("num")
  changeNum() {
    console.log("檢測(cè)到數(shù)據(jù)的修改啦")
  }

  build() {
    Column() {

      Button(`點(diǎn)擊修改 ${this.num}`)
        .onClick(() = > {
          this.num++
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 同時(shí)監(jiān)聽多個(gè)屬性

@Entry
@ComponentV2
struct Index {
  @Local num: number = 100
  @Local age: number = 200

  // 同時(shí)監(jiān)聽多個(gè)狀態(tài)的修改
  @Monitor("num","age")
  changeNum() {
    console.log("檢測(cè)到數(shù)據(jù)的修改啦")
  }

  build() {
    Column() {
      Button(`點(diǎn)擊修改 num ${this.num}`)
        .onClick(() = > {
          this.num++
        })
      Button(`點(diǎn)擊修改 age ${this.age}`)
        .onClick(() = > {
          this.age++
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 的回調(diào)函數(shù)

@Monitor 的回調(diào)函數(shù)可以給我們提供這樣的能力:

  1. 如果監(jiān)聽了多個(gè)狀態(tài),而只有一個(gè)狀態(tài)發(fā)生變化時(shí), 可以給獲知到具體哪個(gè)狀態(tài)發(fā)生了變化
  2. 當(dāng)狀態(tài)發(fā)生變化時(shí),可以獲取到變化前后的兩個(gè)值

@Monitor 的回調(diào)函數(shù)的參數(shù)是 [IMonitor],它是一個(gè)對(duì)象,擁有兩個(gè)屬性

  1. dirty ,是一個(gè)字符串?dāng)?shù)組,里面存放了修改的狀態(tài)的名稱
  2. value,是一個(gè)函數(shù),調(diào)用返回會(huì)返回一個(gè)新的對(duì)象,新對(duì)象中包含了 path:修改的狀態(tài)的名稱,before:修改前的數(shù)據(jù),now:修改后的數(shù)據(jù),另外 value() 調(diào)用時(shí),如果不傳遞參數(shù)并且你是同時(shí)修改多個(gè)狀態(tài)的話,那么它只會(huì)返回第一個(gè)狀態(tài),如果傳遞了參數(shù)-狀態(tài)變量 那么就會(huì)返回該狀態(tài)變量的相關(guān)信息
@Entry
@ComponentV2
struct Index {
  @Local num: number = 100
  @Local age: number = 200

  // 同時(shí)監(jiān)聽多個(gè)狀態(tài)的修改
  @Monitor("num","age")
  changeNum(Monitor: IMonitor) {
    console.log("修改的狀態(tài)", Monitor.dirty)
    console.log("Monitor.value()", JSON.stringify(Monitor.value("age")))

  }

  build() {
    Column() {
      Button(`同時(shí)修改 num 和 age ${this.num}  ${this.age}`)
        .onClick(() = > {
          this.num++
          this.age++
        })

    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 深度監(jiān)聽

@Monitor 需要和 @ObservedV2、@Trace一起使用才能實(shí)現(xiàn)深度監(jiān)聽的效果,需要注意的是:

  1. @Monitor可以直接寫在 @ObserveV2 修飾的class
  2. @Monitor 也可以寫在正常的組件內(nèi)
@ObservedV2
class Person {
  @Trace son: Son = new Son()
}

@ObservedV2
class Son {
  // @Monitor可以直接寫在 @ObserveV2 修飾的class中
  @Monitor("weight")
  weightChange() {
    console.log("1 兒子的體重修改了")
  }

  @Trace weight: number = 200
}


@Entry
@ComponentV2
struct Index {
  person: Person = new Person()
    // @Monitor 也可以寫在正常的組件內(nèi)
  @Monitor("person.son.weight")
  weightChange() {
    console.log("2 兒子的體重唄修改了")
  }

  build() {
    Column() {
      Button(`修改兒子的體重${this.person.son.weight}`)
        .onClick(() = > {
          this.person.son.weight++
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 的限制

在實(shí)際開發(fā)使用中,@Monitor也存在一些限制,無法監(jiān)聽內(nèi)置類型(ArrayMap、Date、Set)的 API 調(diào)用引起的變化,如當(dāng)你檢測(cè)整個(gè)數(shù)組時(shí),你對(duì)數(shù)組使用 push、splice等常見方法修改數(shù)組,是無法檢測(cè)到的。當(dāng)然,當(dāng)整個(gè)數(shù)組被重新賦值時(shí),可以檢測(cè)到它的變化

@ObservedV2
class Person {
  @Trace name: string = "小明"
}


@Entry
@ComponentV2
struct Index {
  @Local
  personList: Person[] = [new Person()]

  @Monitor("personList")
  weightChange() {
    console.log(" 檢測(cè)到數(shù)組修改了")
  }

  build() {
    Column() {
      Button("增加一個(gè)")
        .onClick(() = > {
          // 1 無效 - 無法檢測(cè)到數(shù)組發(fā)生了修改
          this.personList.push(new Person())


          // 2 有效 檢測(cè)到了數(shù)組發(fā)生修改
          // const newPerson = [...this.personList, new Person()]
          // this.personList = newPerson
        })
      ForEach(this.personList, (item: Person) = > {
        Text(item.name)
      })
    }
    .width("100%")
    .height("100%")
  }
}

另外可以通過.語法或者監(jiān)聽數(shù)組長度來變向?qū)崿F(xiàn)檢測(cè)數(shù)組元素發(fā)生變化

.語法

@ObservedV2
class Person {
  @Trace name: string = "小明"
}


@Entry
@ComponentV2
struct Index {
  @Local
  personList: Person[] = [new Person()]

  @Monitor("personList.0")
  // 如果要單獨(dú)監(jiān)聽對(duì)象中的某個(gè)屬性  @Monitor("personList.0.name")
  weightChange() {
    console.log(" 檢測(cè)到數(shù)組修改了")
  }

  build() {
    Column() {
      Button("增加一個(gè)")
        .onClick(() = > {
          const p = new Person()
          p.name = "小黑"
          this.personList[0] = p
        })
      ForEach(this.personList, (item: Person) = > {
        Text(item.name)
      })
    }
    .width("100%")
    .height("100%")
  }
}

監(jiān)聽數(shù)組長度變化

@ObservedV2
class Person {
  @Trace name: string = "小明"
}


@Entry
@ComponentV2
struct Index {
  @Local
  personList: Person[] = [new Person()]

  @Monitor("personList.length")
  weightChange() {
    console.log(" 檢測(cè)到數(shù)組修改了")
  }

  build() {
    Column() {
      Button("增加一個(gè)")
        .onClick(() = > {
          const p = new Person()
          p.name = "小黑"
          this.personList.push(p)
        })
      ForEach(this.personList, (item: Person) = > {
        Text(item.name)
      })
    }
    .width("100%")
    .height("100%")
  }
}

@Computed

@Computed為計(jì)算屬性,可以監(jiān)聽數(shù)據(jù)變化,從而計(jì)算新的值。用法比較簡單

@Entry
@ComponentV2
struct Index {
  @Local num: number = 100

  @Computed
  get numText() {
    return this.num * 2
  }

  build() {
    Column() {
      Button("修改")
        .onClick(() = > {
          this.num++
        })
      Text(`原數(shù)據(jù) ${this.num}`)
      Text(`計(jì)算后 ${this.numText}`)
    }
    .width("100%")
    .height("100%")
  }
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2153

    瀏覽量

    36069
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RDMA設(shè)計(jì)44:RoCE v2原語功能驗(yàn)證與分析

    它是RoCE v2協(xié)議進(jìn)行信息及數(shù)據(jù)交換的核心機(jī)制,也是DUT需要實(shí)現(xiàn)的核心機(jī)制之一,對(duì)該功能的仿真驗(yàn)證需要考慮指令的提交數(shù)據(jù)包的組裝及發(fā)送、數(shù)據(jù)的DMA處理等。
    的頭像 發(fā)表于 02-25 09:26 ?118次閱讀
    RDMA設(shè)計(jì)44:RoCE <b class='flag-5'>v2</b>原語功能驗(yàn)證與分析

    RDMA設(shè)計(jì)37:RoCE v2 子系統(tǒng)模型設(shè)計(jì)

    本博文主要交流設(shè)計(jì)思路,在本博客已給出相關(guān)博文160多篇,希望對(duì)初學(xué)者有用。注意這里只是拋磚引玉,切莫認(rèn)為參考這就可以完成商用IP設(shè)計(jì)。 RoCE v2 子系統(tǒng)模型是用來模擬 RoCE v2 功能
    發(fā)表于 02-06 16:19

    RDMA設(shè)計(jì)30:RoCE v2 發(fā)送模塊2

    當(dāng) RoCE v2 發(fā)送模塊檢測(cè)到發(fā)送隊(duì)列非空時(shí),則從發(fā)送隊(duì)列中讀取一個(gè)發(fā)送隊(duì)列條目,并判斷請(qǐng)求類型。根據(jù)不同的請(qǐng)求類型和請(qǐng)求長度進(jìn)入不同的包生成流程,這一過程由請(qǐng)求狀態(tài)機(jī)實(shí)現(xiàn)。
    的頭像 發(fā)表于 01-27 11:56 ?515次閱讀
    RDMA設(shè)計(jì)30:RoCE <b class='flag-5'>v2</b> 發(fā)送模塊<b class='flag-5'>2</b>

    RDMA設(shè)計(jì)29:RoCE v2 發(fā)送及接收模塊設(shè)計(jì)2

    本博文主要交流設(shè)計(jì)思路,在本博客已給出相關(guān)博文約100篇,希望對(duì)初學(xué)者有用。注意這里只是拋磚引玉,切莫認(rèn)為參考這就可以完成商用IP設(shè)計(jì)。 (1)RoCE v2 發(fā)送模塊 RoCE v2 發(fā)送模塊
    發(fā)表于 01-26 16:47

    RDMA設(shè)計(jì)28:RoCE v2 發(fā)送及接收模塊設(shè)計(jì)

    本博文主要交流設(shè)計(jì)思路,在本博客已給出相關(guān)博文約100篇,希望對(duì)初學(xué)者有用。注意這里只是拋磚引玉,切莫認(rèn)為參考這就可以完成商用IP設(shè)計(jì)。 RoCE v2 發(fā)送及接收模塊負(fù)責(zé)將用戶指令組裝為 RoCE
    發(fā)表于 01-25 10:45

    RDMA設(shè)計(jì)19:RoCE v2 發(fā)送及接收模塊設(shè)計(jì)

    本博文主要交流設(shè)計(jì)思路,在本博客已給出相關(guān)博文約100篇,希望對(duì)初學(xué)者有用。注意這里只是拋磚引玉,切莫認(rèn)為參考這就可以完成商用IP設(shè)計(jì)。 RoCE v2 發(fā)送及接收模塊負(fù)責(zé)將用戶指令組裝
    發(fā)表于 01-06 08:08

    AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析

    AURIX? Audio Application Kit for AURIX? lite Kit V2 深度解析 在音頻技術(shù)不斷發(fā)展的今天,一款功能強(qiáng)大且靈活的音頻應(yīng)用套件對(duì)于電子工程師來說至關(guān)重要
    的頭像 發(fā)表于 12-20 20:35 ?1205次閱讀

    uIO-Stick v2 用戶指南:設(shè)計(jì)、應(yīng)用與安全要點(diǎn)

    uIO-Stick v2 用戶指南:設(shè)計(jì)、應(yīng)用與安全要點(diǎn) 在電子工程領(lǐng)域,接口設(shè)備對(duì)于連接不同系統(tǒng)和實(shí)現(xiàn)功能交互起著至關(guān)重要的作用。uIO-Stick v2 作為一款用于 MOTIX? MCU 設(shè)備
    的頭像 發(fā)表于 12-20 11:10 ?711次閱讀

    RDMA over RoCE V2設(shè)計(jì)1:為什么要設(shè)計(jì)它?

    基于PC-PC或GPU-GPU之間RDMA設(shè)計(jì)已有較多廠商投入,雖然有的大廠投入幾年后折羽而歸,但不影響PC領(lǐng)域成熟應(yīng)用產(chǎn)品的推廣。這里主要討論在FPGA上設(shè)計(jì)RDMA over RoCE V2,雖然已有xilinx的ernic應(yīng)用,但是性價(jià)比以及國產(chǎn)化需求還是有其發(fā)展空間。
    的頭像 發(fā)表于 07-15 10:58 ?688次閱讀
    RDMA over RoCE <b class='flag-5'>V2</b>設(shè)計(jì)1:為什么要設(shè)計(jì)它?

    第三屆大會(huì)回顧第6期 | HarmonyOS NEXT原生智能,助力應(yīng)用低成本生而智能

    原生智能是HarmonyOS NEXT的核心能力之一,通過將人工智能(AI)技術(shù)與操作系統(tǒng)深度融合,實(shí)現(xiàn)了從底層到應(yīng)用層的全面智能化。HarmonyOS NEXT的原生智能是如何實(shí)現(xiàn)的
    的頭像 發(fā)表于 07-14 18:04 ?1149次閱讀
    第三屆大會(huì)回顧第6期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>原生智能,助力應(yīng)用低成本生而智能

    第三屆大會(huì)回顧第2期 | HarmonyOS NEXT內(nèi)核驅(qū)動(dòng)生態(tài)兼容與競(jìng)爭力思考

    隨著HarmonyOS NEXT生態(tài)和技術(shù)的發(fā)展,驅(qū)動(dòng)框架作為北向和南向的生態(tài)中樞,有很多的機(jī)會(huì)。例如,提供更多的信息到應(yīng)用層,實(shí)現(xiàn)精準(zhǔn)的性能功耗控制;打破傳統(tǒng)的分層解耦,簡化關(guān)鍵協(xié)議、關(guān)鍵路徑等等。
    的頭像 發(fā)表于 05-19 19:17 ?1833次閱讀
    第三屆大會(huì)回顧第<b class='flag-5'>2</b>期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>內(nèi)核驅(qū)動(dòng)生態(tài)兼容與競(jìng)爭力思考

    HarmonyOS Next V2 @Local 和@Param

    HarmonyOS Next V2 @Local 和@Param @Local 背景 @Local 是 harmony 應(yīng)用開發(fā)中的 v2 版本中 對(duì)標(biāo)**@State**的狀態(tài)管理修
    的頭像 發(fā)表于 04-02 18:27 ?1054次閱讀
    <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>Next</b> <b class='flag-5'>V2</b> @Local 和@Param

    HarmonyOS Next V2 @Event

    HarmonyOS Next V2 @Event 背景 在上一節(jié)中,我們針對(duì)父子組件,講了關(guān)于傳遞數(shù)據(jù)的知識(shí)。我們了解到 @Local 是管理自己內(nèi)部的數(shù)據(jù)的, @Param 是負(fù)責(zé)接收父組件的數(shù)據(jù)
    的頭像 發(fā)表于 03-31 09:42 ?773次閱讀

    stlink v2為什么無法連接上stm32 stlink unility?

    stlink v2無法連接上stm32 stlink unility
    發(fā)表于 03-14 08:51

    STM2cubeide使用Freertos v2提示錯(cuò)誤怎么解決?

    我一直以為st公司是一個(gè)嚴(yán)謹(jǐn),優(yōu)秀的公司,直到我遇到了stm32cubeide使用了freertosv2 。 為什么我把freertos調(diào)成版本v2建一個(gè)任務(wù)和消息隊(duì)列 ,freertosv2提示
    發(fā)表于 03-12 07:33