第 90 期 - HarmonyOS 中@Observed 和@ObjectLink 装饰器的嵌套类对象属性监听
logoFRONTALK AI/1月22日 16:31/阅读原文

摘要

文章主要阐述 HarmonyOS 里@Observed 和@ObjectLink 装饰器在嵌套类对象属性监听方面的特性,包括监听范围、存在的问题及解决方法,并给出了 DEMO 示例。

一、装饰器特性介绍

文章首先提到@ObjectLink 和@Observed 是用于对嵌套对象进行属性监听的状态管理标签。它们的诞生是为了解决像嵌套对象、数组套数组、数组套对象等复杂数据结构的监听问题,以便 ArkUI 框架监听数据变化从而实现 UI 渲染。

二、监听范围的限制

  1. 使用这两个装饰器只能监听嵌套后的一级对象属性以及基类属性,无法监听子级及其以下的对象属性。
  2. 作者通过之前博客中的 DEMO 示例代码来解释这个问题,在列表操作数据变化时,操作了一级属性会导致 UI 刷新,操作二级和三级属性则不会。如在if判断包裹的select属性为@ObjuectLink直接监听的对象一级属性,操作该属性数值变化,if语句块下方的indexcontent内容变化能刷新到 UI,前三个Item点击无效果,后三个点击有 UI 刷新。

三、存在问题的解决方法

  1. 官方开发情况
    • 嵌套深层次数据结构监听问题已反馈给华为官方,目前他们正在开发中,@ObservedV2装饰器和@Trace装饰器(类属性变化观测)的新状态管理标签还未开发完成,不推荐使用,因为随时会变化。
  2. 目前的解决方案
    • 二次拆分:进行二次拆分,继续往下监听对象,可实现多层数据监听,但如果嵌套层数过多,这种方式过于繁琐。
    • 操作赋值:对监听层的属性对象进行操作赋值,不对属性对象之下的属性进行单独赋值。
    • 利用监听层属性变化:每次改变嵌套数据时,只要监听层有属性变化,UI 就会及时刷新,如 DEMO 示例中Select属性改变时 UI 会及时刷新。

四、DEMO 示例

  1. 示例代码中引入了@ohos.arkui.modifier中的ButtonModifierTextModifier
  2. 定义了多个@Observed装饰的类,如BagBagCopyCupUserBookBookName等类,这些类有着不同的属性和构造函数。
  3. 例如@Component装饰的ViewA结构中,有@ObjectLink修饰的bag属性,在build方法中有TextButton等组件,ButtononClick方法会改变bagsize属性。
  4. @Component装饰的ViewC结构中,有@ObjectLink修饰的bookName属性,在build方法中的ButtononClick方法操作bookNamecupsize属性(嵌套对象属性)时 UI 不刷新,操作bookNamesize(基类属性)时 UI 会刷新。
  5. @Entry@Component@Preview装饰的ViewB结构中,有@State修饰的userchild属性,在build方法中的ButtononClick方法操作childbookNamesize属性等情况,展示了不同操作对 UI 刷新的影响。同时还有TextCommonStyleButtonCommonStyle类来设置组件的样式。
 
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有