文档开发者中心
我的

Harmony OS ets @StorageProp和@Watch修饰同一个变量问题

Harmony OS ets @StorageProp和@Watch修饰同一个变量,当变量值变更时,@watch绑定的函数没有执行。

代码如下:

收起
自动换行
深色代码主题
复制
@Entry
@Component
export struct TestView {
  @StorageProp('isHorizontal') @Watch("onChanged") horizontal: boolean = this.getHorizontal();
  @State flexDirection: FlexDirection = this.horizontal ? FlexDirection.Row : FlexDirection.Column;

  onChanged() {
    console.log('receive watch event')
  }

  public getHorizontal(): boolean {
    if (AppStorage.Get('isHorizontal') == null) {
      AppStorage.SetOrCreate('isHorizontal', false);
    }
    return AppStorage.Get('isHorizontal');
  }

  public setHorizontal(state: boolean): void {
    AppStorage.SetOrCreate('isHorizontal', state);
    return ;
  }

  build() {
    Flex({
      direction: this.flexDirection
    }) {
      Row() {
        Button('TEST').onClick(() => {
          console.log('horizontal ' + `${this.horizontal}` + ' change to ' + `${!this.horizontal}`)
          this.setHorizontal(!this.horizontal);
          console.log('after change = ' + `${this.horizontal}`)
        })
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

输出Log信息如下:

[phone][Console   DEBUG]  12/13 17:57:04 8372   app Log: horizontal false change to true

[phone][Console   DEBUG]  12/13 17:57:04 8372   app Log: after change = true

补充:

参照HarmonyOS Developer API指导文档,@StorageProp和@Watch可以修饰同一个变量。

原文描述如下:

应用可以注册回调方法。当一个被@State, @Prop, @Link, @ObjectLink, @Provide, @Consume, @StorageProp, 以及 @StorageLink中任意一个装饰器修饰的变量改变时,均可触发此回调。@Watch中的变量一定要使用(“”)进行包装。

点赞
1
收藏
回复
2
分享
举报
浏览890 编辑于2021-12-13 10:29未知归属地
全部评论
最多点赞
最新发布
最早发布
你好,你的问题已向开发人员反馈,请关注官网更新。
2楼回复于2021-12-16 01:10 未知归属地
欢迎开发小伙伴们进来帮帮楼主
1楼回复于2021-12-13 11:03 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。