HarmonyOS鸿蒙Next中@Track装饰类属性可能无法刷新UI的问题
HarmonyOS鸿蒙Next中@Track装饰类属性可能无法刷新UI的问题
- 点击 切换为1 UI正常显示为1
2.点击 替换整个实例 UI无变化,理论上应该显示为空
设备名称:HUAWEI Mate 60
HarmonyOS版本 5.1.0
软件版本:5.1.0.150
API版本:5.0.5(17)
OpenHarmony版本:5.0.1
@Observed
export class TestModel {
[@Track](/user/Track) name?: string
}
import { TestModel } from '../model/TestModel'
import { hilog } from '@kit.PerformanceAnalysisKit'
@Entry
@Component
struct Index {
@State @Watch('onModelChange') model: TestModel = new TestModel()
build() {
Column() {
Button("切换为1")
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.model.name = "1"
})
Button("替换整个实例")
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.model = new TestModel()
})
Text(this.model.name ?? "空")
.id('HelloWorld')
.fontSize($r('app.float.page_text_font_size'))
.fontWeight(FontWeight.Bold)
}
.justifyContent(FlexAlign.Center)
.height('100%')
.width('100%')
}
onModelChange(changedPropertyName: string) {
hilog.info(0x0000, 'testTag', '%{public}s', 'onModelChange');
}
}
更多关于HarmonyOS鸿蒙Next中@Track装饰类属性可能无法刷新UI的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这个问题看似简单,其实有很多细节需要探究
问题现象:当class的属性被装饰为@Track时,再次赋值undefined时,组件树没有刷新
原因:针对@Observed追踪的Tack属性赋值时,不对undefined进行追踪,所以组件不会刷新
详细步骤:
export class TestModel {
name?: string
}
这样就会达到预期
扩展:
根据我的分析,这个跟代理有关,当class被@Observed装饰后,new出的class对象,会被代理,例如字段会加上“_ob”前缀,至于其中的原理不得而知,或许是一个bug
如果使用V2版本则不会有这个问题,即使给name赋值undefined,界面会正常刷新,根据这个现象反推v1,说明大概率是一个bug
如果对你有帮助,望采纳!
更多关于HarmonyOS鸿蒙Next中@Track装饰类属性可能无法刷新UI的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
TestModel被@Observed装饰(标记为可观察类),name属性用@Track装饰(标记该属性变化需触发 UI 更新);Index组件中model用@State装饰(组件内部状态)。
- 点击 “切换为 1” 生效:直接修改
model.name(@Track标记的属性),@Observed类会感知到属性变化,@State检测到依赖更新,触发 UI 刷新,符合预期。 - 点击 “替换整个实例” 不生效:将
model赋值为新的TestModel实例(引用变化),但 UI 未更新,核心原因是:在部分 ArkUI 版本(尤其是 API 5.x)中,@State对@Observed装饰的类实例的 “引用替换” 追踪存在局限性 —— 框架可能优先依赖@Track标记的属性变化,而忽略了整个实例的引用替换,导致未触发 UI 刷新。
开发者你好,请参考我的楼层回复。


