文档管理中心
FAQ应用框架开发UI框架组件使用如何解决单个状态变量绑定多个@Watch监听器时部分监听器失效的问题

如何解决单个状态变量绑定多个@Watch监听器时部分监听器失效的问题

问题现象

在HarmonyOS开发中,当一个状态变量@State绑定了两个@Watch监听器时,观察到其中一个监听器生效,而另一个监听器未生效。

问题代码示例参考如下:

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. struct S20250403171354570182 {
  4. @State @Watch('change1') @Watch('change2') num: number = 0;
  5. // 监听不生效
  6. change1() {
  7. console.info('watch1 ');
  8. }
  9. // 监听生效
  10. change2() {
  11. console.info('watch2');
  12. }
  13. build() {
  14. RelativeContainer() {
  15. Text(this.num.toString())
  16. .id('HelloWorld')
  17. .fontSize($r('app.float.page_text_font_size'))
  18. .fontWeight(FontWeight.Bold)
  19. .alignRules({
  20. center: { anchor: '__container__', align: VerticalAlign.Center },
  21. middle: { anchor: '__container__', align: HorizontalAlign.Center }
  22. })
  23. .onClick(() => {
  24. this.num++;
  25. })
  26. }
  27. .height('100%')
  28. .width('100%')
  29. }
  30. }

change1()函数未执行,change2()函数被执行,问题现象如下:

解决方案

状态变量的变化无法被多个@Watch监听器同时监听。因此,需要将所有需要在状态变量变化时执行的操作合并到一个@Watch回调方法中,删除多余的@Watch和回调方法。

总结

多个@Watch不能用于一个状态变量,如果使用多个会导致后面的监听器覆盖前面,导致出现多余的代码。如果想要使用一个监听器监听多个变量可以使用状态管理V2中的@Monitor装饰器,其差异详见官方文档@Monitor与@Watch对比

在 FAQ 中进行搜索
请输入您想要搜索的关键词