鸿蒙(HarmonyOS)开发实战:将非观察数据变为可观察数据-makeObserved接口详解

鸿蒙开发往期必看:

HarmonyOS NEXT应用开发性能实践总结

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

 “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路径!


概述

  • 状态管理框架已提供@ObservedV2/@Trace用于观察类属性变化,makeObserved接口提供主要应用于@ObservedV2/@Trace无法涵盖的场景:

    • class的定义在三方包中:开发者无法手动对class中需要观察的属性加上@Trace标签,可以使用makeObserved使得当前对象可以被观察。

    • 当前类的成员属性不能被修改:因为@Trace观察类属性会动态修改类的属性,这个行为在@Sendable装饰的class中是不被允许的,可以使用makeObserved。

    • interface或者JSON.parse返回的匿名对象:这类场景往往没有明确的class声明,开发者无法使用@Trace标记当前属性可以被观察,可以使用makeObserved。

  • 使用makeObserved接口需要导入UIUtils。

    import { UIUtils } from '@kit.ArkUI';

限制条件

  • makeObserved仅支持对象类型传参。

    import { UIUtils } from '@kit.ArkUI';
    let res = UIUtils.makeObserved(2); // 非对象类型入参,错误用法
    class Info {
      id: number = 0;
    }
    let rawInfo: Info = UIUtils.makeObserved(new Info()); // 正确用法
  • makeObserved不支持传入被@ObservedV2、@Observed装饰的类的实例以及已经被makeObserved封装过的代理数据。为了防止双重代理,makeObserved发现入参为上述情况时则直接返回,不做处理。

    import { UIUtils } from '@kit.ArkUI';
    @ObservedV2
    class Info {
      @Trace id: number = 0;
    }
    // 错误用法:makeObserved发现传入的实例是@ObservedV2装饰的类的实例,则返回传入对象自身
    let observedInfo: Info = UIUtils.makeObserved(new Info());
    
    class Info2 {
      id: number = 0;
    }
    // 正确用法:传入对象既不是@ObservedV2/@Observed装饰的类的实例,也不是makeObserved封装过的代理数据
    // 返回可观察数据
    let observedInfo1: Info2 = UIUtils.makeObserved(new Info2());
    // 错误用法:传入对象为makeObserved封装过的代理数据,此次makeObserved不做处理
    let observedInfo2: Info2 = UIUtils.makeObserved(observedInfo1);
  • makeObserved可以用在@Component装饰的自定义组件中,但不能和状态管理V1的状态变量装饰器连用,如果连用,则会抛出运行时异常。

    // 错误写法,运行时异常
    @State message: Info = UIUtils.makeObserved(new Info(20));

    下面message2的写法不会抛异常,原因是this.message是@State装饰的,其实现等同于@Observed,而UIUtils.makeObserved的入参是@Observed装饰的class,会直接返回自身。因此对于message2来说,他的初始值不是makeObserved的返回值,而是@State装饰的变量。

    import { UIUtils } from '@kit.ArkUI';
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值