0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS Next V2 @Monitor 和@Computed

万少 来源:jf_22972444 作者:jf_22972444 2025-04-02 18:26 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

HarmonyOS Next V2 @Monitor 和@Computed

@Monitor 介绍

@Monitor 是状态把管理 V2 版本中的用于监听状态变量修改的技术。

它可以直接用在

  1. @ComponentV2装饰的自定义组件中,用于被@Local@Param@Provider@Comsumer@Computed修饰的状态变量中
  2. 对于深层次的数据,如深层次对象、对象数组等,需要搭配@ObservedV2@Trace一起使用。
  3. 可以同时监听多个属性
  4. 可以获取到监听属性的修改前后的数据变化

对比状态管理 V1 中的@Watch

@Monitor@Watch功能要强大不少

  1. @Watch 不能用在@ComponentV2修饰的
  2. @Watch 不具备深度监听的功能
  3. @Watch 无法同时监听多个属性
  4. @Watch 无法检测 属性修改前后的变化

@Monitor 监听单个属性

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

  @Monitor("num")
  changeNum() {
    console.log("检测到数据的修改啦")
  }

  build() {
    Column() {

      Button(`点击修改 ${this.num}`)
        .onClick(() = > {
          this.num++
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 同时监听多个属性

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

  // 同时监听多个状态的修改
  @Monitor("num","age")
  changeNum() {
    console.log("检测到数据的修改啦")
  }

  build() {
    Column() {
      Button(`点击修改 num ${this.num}`)
        .onClick(() = > {
          this.num++
        })
      Button(`点击修改 age ${this.age}`)
        .onClick(() = > {
          this.age++
        })
    }
    .width("100%")
    .height("100%")
  }
}

@Monitor 的回调函数

@Monitor 的回调函数可以给我们提供这样的能力:

  1. 如果监听了多个状态,而只有一个状态发生变化时, 可以给获知到具体哪个状态发生了变化
  2. 当状态发生变化时,可以获取到变化前后的两个值

@Monitor 的回调函数的参数是 [IMonitor],它是一个对象,拥有两个属性

  1. dirty ,是一个字符串数组,里面存放了修改的状态的名称
  2. value,是一个函数,调用返回会返回一个新的对象,新对象中包含了 path:修改的状态的名称,before:修改前的数据,now:修改后的数据,另外 value() 调用时,如果不传递参数并且你是同时修改多个状态的话,那么它只会返回第一个状态,如果传递了参数-状态变量 那么就会返回该状态变量的相关信息
@Entry
@ComponentV2
struct Index {
  @Local num: number = 100
  @Local age: number = 200

  // 同时监听多个状态的修改
  @Monitor("num","age")
  changeNum(Monitor: IMonitor) {
    console.log("修改的状态", Monitor.dirty)
    console.log("Monitor.value()", JSON.stringify(Monitor.value("age")))

  }

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

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

@Monitor 深度监听

@Monitor 需要和 @ObservedV2@Trace一起使用才能实现深度监听的效果,需要注意的是:

  1. @Monitor可以直接写在 @ObserveV2 修饰的class
  2. @Monitor 也可以写在正常的组件内
@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 也可以写在正常的组件内
  @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 的限制

在实际开发使用中,@Monitor也存在一些限制,无法监听内置类型(ArrayMapDateSet)的 API 调用引起的变化,如当你检测整个数组时,你对数组使用 pushsplice等常见方法修改数组,是无法检测到的。当然,当整个数组被重新赋值时,可以检测到它的变化

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


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

  @Monitor("personList")
  weightChange() {
    console.log(" 检测到数组修改了")
  }

  build() {
    Column() {
      Button("增加一个")
        .onClick(() = > {
          // 1 无效 - 无法检测到数组发生了修改
          this.personList.push(new Person())


          // 2 有效 检测到了数组发生修改
          // const newPerson = [...this.personList, new Person()]
          // this.personList = newPerson
        })
      ForEach(this.personList, (item: Person) = > {
        Text(item.name)
      })
    }
    .width("100%")
    .height("100%")
  }
}

另外可以通过.语法或者监听数组长度来变向实现检测数组元素发生变化

.语法

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


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

  @Monitor("personList.0")
  // 如果要单独监听对象中的某个属性  @Monitor("personList.0.name")
  weightChange() {
    console.log(" 检测到数组修改了")
  }

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

监听数组长度变化

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


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

  @Monitor("personList.length")
  weightChange() {
    console.log(" 检测到数组修改了")
  }

  build() {
    Column() {
      Button("增加一个")
        .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为计算属性,可以监听数据变化,从而计算新的值。用法比较简单

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

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

  build() {
    Column() {
      Button("修改")
        .onClick(() = > {
          this.num++
        })
      Text(`原数据 ${this.num}`)
      Text(`计算后 ${this.numText}`)
    }
    .width("100%")
    .height("100%")
  }
}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    80

    文章

    2147

    浏览量

    35591
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RDMA设计5:RoCE V2 IP架构

    上面分析,基于RoCE v2 高速数据传输IP 的高速传输应用整体架构如图 1 所示。 图1 基于RoCE V2 IP应用的系统整体架构图 它通过 QSFP28 接口连接上位机进行
    发表于 11-25 10:34

    RDMA over RoCE V2设计1:为什么要设计它?

    基于PC-PC或GPU-GPU之间RDMA设计已有较多厂商投入,虽然有的大厂投入几年后折羽而归,但不影响PC领域成熟应用产品的推广。这里主要讨论在FPGA上设计RDMA over RoCE V2,虽然已有xilinx的ernic应用,但是性价比以及国产化需求还是有其发展空间。
    的头像 发表于 07-15 10:58 504次阅读
    RDMA over RoCE <b class='flag-5'>V2</b>设计1:为什么要设计它?

    第三届大会回顾第6期 | HarmonyOS NEXT原生智能,助力应用低成本生而智能

    原生智能是HarmonyOS NEXT的核心能力之一,通过将人工智能(AI)技术与操作系统深度融合,实现了从底层到应用层的全面智能化。HarmonyOS NEXT的原生智能是如何实现的
    的头像 发表于 07-14 18:04 892次阅读
    第三届大会回顾第6期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>原生智能,助力应用低成本生而智能

    第三届大会回顾第2期 | HarmonyOS NEXT内核驱动生态兼容与竞争力思考

    随着HarmonyOS NEXT生态和技术的发展,驱动框架作为北向和南向的生态中枢,有很多的机会。例如,提供更多的信息到应用层,实现精准的性能功耗控制;打破传统的分层解耦,简化关键协议、关键路径等等。
    的头像 发表于 05-19 19:17 1556次阅读
    第三届大会回顾第<b class='flag-5'>2</b>期 | <b class='flag-5'>HarmonyOS</b> <b class='flag-5'>NEXT</b>内核驱动生态兼容与竞争力思考

    HarmonyOS Next V2 @Local 和@Param

    HarmonyOS Next V2 @Local 和@Param @Local 背景 @Local 是 harmony 应用开发中的 v2 版本中 对标**@State**的状态管理修
    的头像 发表于 04-02 18:27 838次阅读
    <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 背景 在上一节中,我们针对父子组件,讲了关于传递数据的知识。我们了解到 @Local 是管理自己内部的数据的, @Param 是负责接收父组件的数据
    的头像 发表于 03-31 09:42 616次阅读

    stlink v2为什么无法连接上stm32 stlink unility?

    stlink v2无法连接上stm32 stlink unility
    发表于 03-14 08:51

    STM2cubeide使用Freertos v2提示错误怎么解决?

    我一直以为st公司是一个严谨,优秀的公司,直到我遇到了stm32cubeide使用了freertosv2 。 为什么我把freertos调成版本v2建一个任务和消息队列 ,freertosv2提示
    发表于 03-12 07:33

    在linux使用HUMMINGGBIRD Debugger Kit V2连接目标板上e203提示出错是怎么回事?

    在linux使用HUMMINGGBIRD Debugger Kit V2 连接目标板上e203提示出错如下: (hbirdenv) root@linuxczp:/home/nuclei-hbird
    发表于 03-07 16:32

    HarmonyOS NEXT 原生应用/元服务-DevEco Profiler性能优化过程

    优化代码; 4.再次使用“Realtime Monitor”查看各项资源的使用情况是否符合预期,来验证代码修改的可行性。 本文主要参考与引用自HarmonyOS官方文档。
    发表于 02-19 15:28

    微软OmniParser V2:大模型转化为计算机智能体

    微软近日宣布,视觉Agent解析框架OmniParser已发布最新版本V2。这一新版本具有将大型语言模型如OpenAI(4o/o1/o3-mini)、DeepSeek(R1)、Qwen(2.5VL
    的头像 发表于 02-18 09:31 2678次阅读

    微软OmniParser V2发布:大模型转化为计算机智能体

    近日,微软官网宣布了一项重要更新。微软发布了其视觉Agent解析框架OmniParser的最新版本V2。这一新版本具备将包括OpenAI的4o、o1、o3-mini,DeepSeek的R1,Qwen
    的头像 发表于 02-17 14:35 2946次阅读

    SAM IoT Wx v2硬件用户指南

    电子发烧友网站提供《SAM IoT Wx v2硬件用户指南.pdf》资料免费下载
    发表于 01-21 14:02 0次下载
    SAM IoT Wx <b class='flag-5'>v2</b>硬件用户指南

    名单公布!【书籍评测活动NO.56】极速探索HarmonyOS NEXT:纯血鸿蒙应用开发实践

    本书深入剖析了HarmonyOS NEXT的各项技术,通过丰富的实战案例,由浅入深地解析了HarmonyOS NEXT的原理与应用。借助多样化的实战案例和丰富的配套资源,读者可以全面
    发表于 01-20 16:53

    HarmonyOS NEXT 应用开发练习:智能视频推荐

    一、整体思路 本DEMO展示了如何在HarmonyOS NEXT平台上开发一个智能视频推荐应用。应用通过模拟的用户偏好数据,为用户推荐可能感兴趣的视频。用户可以通过滑动屏幕查看推荐的视频列表,并点击
    发表于 01-02 16:26