鸿蒙开发往期必看:
一分钟了解”纯血版!鸿蒙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';