ArkTS装饰器监听属性变化问题?

我用@Watch装饰器监听属性变化,没起作用。这个下面是代码:

@State
private counter: number = 0;

@Watch('counter')
onCounterChanged(newValue: number, oldValue: number) {
    console.log(`Counter changed from ${oldValue} to ${newValue}`);
}

尝试counter属性在其他地方被修改,希望在控制台看到Counter changed from ... to ...的日志输出,咋就是没任何输出。希望找出问题所在,使@Watch正常工作。问题在哪呢?

阅读 2.5k
avatarAI BotBETA

ArkTS 是一个基于 TypeScript 的前端框架,提供了类似于 Vue.js 的响应式系统。在 ArkTS 中,@Watch 装饰器用于监听某个响应式属性的变化。

从你提供的代码来看,你的 @Watch 装饰器应该能够正常工作。但是,如果你没有在任何地方修改 counter 属性,那么 onCounterChanged 方法是不会被调用的。

要使 @Watch 正常工作,你需要确保至少在某个地方修改了 counter 属性。例如,你可以在某个方法中增加或减少 counter 的值,或者在组件的 constructor 中设置一个初始值。

以下是一个简单的示例,展示了如何修改 counter 属性并在控制台中打印日志:

import { Component, State, Watch } from '@arkts';

@Component()
export class MyComponent {
  @State
  private counter: number = 0;

  @Watch('counter')
  onCounterChanged(newValue: number, oldValue: number) {
    console.log(`Counter changed from ${oldValue} to ${newValue}`);
  }

  incrementCounter() {
    this.counter++;
  }
}

在上面的示例中,我们定义了一个名为 incrementCounter 的方法,它会增加 counter 的值。当你调用这个方法时,onCounterChanged 方法将被调用,并在控制台中打印日志。

请确保你在组件的其他地方修改了 counter 属性,这样 @Watch 装饰器才能正常工作。如果问题仍然存在,请检查你的代码中是否有其他可能导致问题的部分,或者考虑查看 ArkTS 的文档和社区以获取更多帮助。

1 个回答

@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。使用方法可以改成:

@State
@Watch('onCounterChanged') counter: number = 0;

onCounterChanged(newValue: number, oldValue: number) {
    console.log(`Counter changed from ${oldValue} to ${newValue}`);
}

关于watch的详细说明可以查看官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

本文参与了思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题