HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新
HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新
@Component
export struct IntegralChannelDialog {
// 监听外部传入的visible变量,visible值发生变化时触发onChange回调函数
@Link @Watch("onChange") visible: boolean
onCancel?: () => void;
onConfirm?: () => void;
@Prop @Watch("dataChange")
dialogContent: IntegralDialogContent
// 通过CustomDialogController的builder参数绑定弹窗组件MyCustomDialog
private controller = new CustomDialogController({
builder: BaseCustomDialog({
visible: $visible,
onCancel: this.onCancel,
onConfirm: this.onConfirm,
content: this.content
}),
cancel: () => {
this.visible = false
},
alignment: DialogAlignment.Center,
backgroundColor: $r('app.color.xxx'),
cornerRadius: '10vp'
})
dataChange() {
ExLogger.i("NormalDialog", JSON.stringify(this.dialogContent))
}
// visible的值发生变化时触发,若visible最新值为true通过弹窗控制器打开弹窗,否则关闭弹窗
onChange() {
if (this.visible) {
this.controller.open()
} else {
this.controller.close()
}
}
build() {
}
@Builder
content(): void {
IntegralTip({
title: this.dialogContent?.title,
list: [],
total: this.dialogContent?.total
})
}
}
@CustomDialog
export struct BaseCustomDialog {
@Link visible: boolean;
// 被@CustomDialog装饰器修饰的组件必须持有CustomDialogController类型属性参数
controller: CustomDialogController;
// 弹窗交互事件参数,点击确认和取消按钮时的回调函数
onCancel?: () => void;
onConfirm?: () => void;
@BuilderParam
content: () => void
build() {
Column({ space: 12 }) {
this.content?.()
}
.height(AUTO)
}
}
dataChange()方法能监听到数据类的变化 ,但是ui并不会更新
更多关于HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
由于Demo不够完整,有部分对象、方法没有提供,导致无法进行运行复现,麻烦提供一个可运行复现的版本;
目前在您代码中存在[@BuilderParam](/user/BuilderParam)装饰器this指向问题,content: this.content 传参时this指向的是BaseCustomDialog,而不是IntegralChannelDialog,可使用箭头函数进行传递即:content: ():void=>{this.content }
参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builderparam-V5#初始化builderparam装饰的方法
可参考文档中的【需要注意this的指向】说明以及示例
更多关于HarmonyOS 鸿蒙Next BuildParam 传递的构建函数,数据变化不会引起UI更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
应该是this的指向问题导致的
private controller = new CustomDialogController({
builder: BaseCustomDialog({
visible: $visible,
onCancel: this.onCancel,
onConfirm: this.onConfirm,
content: this.content.bind(this)
}),
传递时增加了bind(this)
在HarmonyOS(鸿蒙)系统中,Next BuildParam 传递的构建函数通常用于定义UI组件的更新逻辑。如果数据变化没有引起UI更新,这通常意味着数据绑定机制没有正确实现或者状态管理没有生效。
在鸿蒙开发中,UI组件的更新依赖于数据的实时性。当数据发生变化时,如果通过正确的数据绑定机制,UI组件应该能够感知到这种变化并自动更新。如果数据变化没有触发UI更新,首先需要检查数据绑定的实现方式。确保数据的变化是通过Observable对象或者具有通知机制的类进行管理的。
此外,检查构建函数中是否有条件渲染逻辑,这些逻辑可能阻止了UI的更新。确保条件判断是基于正确的数据状态。
还需要注意的是,鸿蒙系统有自己的生命周期管理机制。在某些情况下,如果组件的生命周期状态不允许更新(例如,组件已经销毁),那么即使数据发生变化,UI也不会更新。
最后,检查是否有异步操作或者延迟更新的逻辑,这些可能导致数据变化在UI更新前被忽略。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html