第 90 期 - HarmonyOS 中@Observed 和@ObjectLink 装饰器的嵌套类对象属性监听
摘要
文章主要阐述 HarmonyOS 里@Observed 和@ObjectLink 装饰器在嵌套类对象属性监听方面的特性,包括监听范围、存在的问题及解决方法,并给出了 DEMO 示例。
一、装饰器特性介绍
文章首先提到@ObjectLink 和@Observed 是用于对嵌套对象进行属性监听的状态管理标签。它们的诞生是为了解决像嵌套对象、数组套数组、数组套对象等复杂数据结构的监听问题,以便 ArkUI 框架监听数据变化从而实现 UI 渲染。
二、监听范围的限制
- 使用这两个装饰器只能监听嵌套后的一级对象属性以及基类属性,无法监听子级及其以下的对象属性。
- 作者通过之前博客中的 DEMO 示例代码来解释这个问题,在列表操作数据变化时,操作了一级属性会导致 UI 刷新,操作二级和三级属性则不会。如在
if
判断包裹的select
属性为@ObjuectLink
直接监听的对象一级属性,操作该属性数值变化,if
语句块下方的index
和content
内容变化能刷新到 UI,前三个Item
点击无效果,后三个点击有 UI 刷新。
三、存在问题的解决方法
- 官方开发情况
- 嵌套深层次数据结构监听问题已反馈给华为官方,目前他们正在开发中,
@ObservedV2
装饰器和@Trace
装饰器(类属性变化观测)的新状态管理标签还未开发完成,不推荐使用,因为随时会变化。
- 嵌套深层次数据结构监听问题已反馈给华为官方,目前他们正在开发中,
- 目前的解决方案
- 二次拆分:进行二次拆分,继续往下监听对象,可实现多层数据监听,但如果嵌套层数过多,这种方式过于繁琐。
- 操作赋值:对监听层的属性对象进行操作赋值,不对属性对象之下的属性进行单独赋值。
- 利用监听层属性变化:每次改变嵌套数据时,只要监听层有属性变化,UI 就会及时刷新,如 DEMO 示例中
Select
属性改变时 UI 会及时刷新。
四、DEMO 示例
- 示例代码中引入了
@ohos.arkui.modifier
中的ButtonModifier
和TextModifier
。 - 定义了多个
@Observed
装饰的类,如Bag
、BagCopy
、Cup
、User
、Book
、BookName
等类,这些类有着不同的属性和构造函数。 - 例如
@Component
装饰的ViewA
结构中,有@ObjectLink
修饰的bag
属性,在build
方法中有Text
、Button
等组件,Button
的onClick
方法会改变bag
的size
属性。 - 在
@Component
装饰的ViewC
结构中,有@ObjectLink
修饰的bookName
属性,在build
方法中的Button
的onClick
方法操作bookName
的cup
的size
属性(嵌套对象属性)时 UI 不刷新,操作bookName
的size
(基类属性)时 UI 会刷新。 - 在
@Entry
、@Component
、@Preview
装饰的ViewB
结构中,有@State
修饰的user
和child
属性,在build
方法中的Button
的onClick
方法操作child
的bookName
的size
属性等情况,展示了不同操作对 UI 刷新的影响。同时还有TextCommonStyle
和ButtonCommonStyle
类来设置组件的样式。
Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有