HarmonyOS 鸿蒙Next:关于指南中@Observed装饰器和@ObjectLink装饰器

发布于 1周前 作者 gougou168 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:关于指南中@Observed装饰器和@ObjectLink装饰器

概述中@ObjectLink装饰的变量不能赋初值:

cke_449.png

但在常见问题–复杂嵌套对象属性更改失效 的解答中:

cke_5168.png

此处的正例与概述矛盾,不知是有误还是我理解错误?



关于HarmonyOS 鸿蒙Next:关于指南中@Observed装饰器和@ObjectLink装饰器的问题,您也可以访问:https://www.itying.com/category-93-b0.html 联系官网客服。

4 回复

升级HarmonyOS后,发现系统界面更加美观,色彩搭配也很舒适。

感谢答复,希望华为资料审核仔细一些吧。

  • [@ObjectLink](/user/ObjectLink)装饰的变量必须从父组件初始化,并且只能接收被[@Observed](/user/Observed)装饰的类的实例 。

你好,鸿蒙开发者同僚

关于你的问题《[@Observed](/user/Observed)装饰器和[@ObjectLink](/user/ObjectLink)装饰器》对这两机制的理解与应用存在困惑,你可以参考一下代码

[@Observed](/user/Observed)装饰器

[@Observed](/user/Observed)装饰器用于观察嵌套对象或数组的属性变化 。它的主要作用是让嵌套对象或数组中的属性变化能够被实时监听和同步。使用[@Observed](/user/Observed)装饰的类,其属性变化会通过代理的setter和getter通知依赖它的[@ObjectLink](/user/ObjectLink)包装类,从而实现数据的双向同步 。

[@ObjectLink](/user/ObjectLink)装饰器

[@ObjectLink](/user/ObjectLink)装饰器用于在嵌套类对象属性变化的场景中进行双向数据同步 。它的主要作用是让子组件中的状态变量与父组件中的状态变量保持同步。[@ObjectLink](/user/ObjectLink)装饰的变量相当于指向数据源的指针,禁止对其进行赋值操作,否则会打断同步链并导致运行时错误 。

主要区别

1.使用场景

  • [@Observed](/user/Observed)装饰器用于观察嵌套对象或数组的属性变化,适用于需要实时监听数据变化的场景。
  • [@ObjectLink](/user/ObjectLink)装饰器用于子组件中的状态变量与父组件中的状态变量进行双向数据同步,适用于需要实时同步数据的场景。

2.使用限制

  • [@Observed](/user/Observed)装饰类会改变类的原始原型链,可能会与其他类装饰器产生冲突。
  • [@ObjectLink](/user/ObjectLink)装饰器不能在[@Entry](/user/Entry)装饰的自定义组件中使用 。

3.变量的传递和访问规则

  • [@ObjectLink](/user/ObjectLink)装饰的变量必须从父组件初始化,并且只能接收被[@Observed](/user/Observed)装饰的类的实例 。
  • [@Prop](/user/Prop)装饰的变量可以从父组件或其他任何地方初始化,并且在本地拷贝了数据源,允许本地修改,但不支持双向同步。

4.数据同步机制

  • [@ObjectLink](/user/ObjectLink)装饰的变量和数据源的关系是双向同步,相当于指向数据源的指针 。
  • [@Prop](/user/Prop)装饰的变量和数据源的关系是单向同步,本地拷贝了数据源,修改本地拷贝不会影响原始数据源 。
[@Observed](/user/Observed)
class Outer {
  [@ObjectLink](/user/ObjectLink) inner: Inner = new Inner();
}

class Inner { value: number = 0; }

@Entry @Component struct Page { @State outer: Outer = new Outer();

build() { Column() { Text(Outer value: ${<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.outer.inner.value}) Button(‘change’) .onClick(() => { this.outer.inner.value += 1; }) } } } <button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!

回到顶部