HarmonyOS 鸿蒙Next中关于@Builder刷新问题
HarmonyOS 鸿蒙Next中关于@Builder刷新问题 先看代码:
interface A {
text: string
}
[@Builder](/user/Builder)
function builder1(text: string) {
Text(text)
}
[@Builder](/user/Builder)
function builder2(a: A) {
Text(a.text)
}
@Entry
@Component
struct Test {
@State text: string = "hello"
build() {
Column() {
builder1(this.text)
builder2({ text: this.text })
Button("change")
.onClick(() => {
this.text = "world"
})
}
}
}
有没有人觉得这个刷新很反直觉,我觉得是 builder1 刷新而 builder2 不刷新,结果却是相反,有没有知道原因的,解释一下
更多关于HarmonyOS 鸿蒙Next中关于@Builder刷新问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
自定义构建函数的参数传递有按值传递和按引用传递两种。按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。调用@Builder装饰的函数默认按值传递。当传递的参数为状态变量时,状态变量的改变不会引起@Builder方法内的UI刷新。
builder1是按值传递,不会刷新;Builder2是按引用传递,会刷新。
更多关于HarmonyOS 鸿蒙Next中关于@Builder刷新问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
懂了,
看我这个帖子,是按引用传递的,在dialog中改变状态,父组件可以刷新ui,但是弹框内不能刷新ui
https://developer.huawei.com/consumer/cn/forum/topic/0203169991579279240?fid=0109140870620153026
@Builder在鸿蒙Next中用于构建自定义组件。其刷新机制基于状态管理,当@Builder依赖的状态变量(@State、@Prop等)发生变化时,会触发UI重新渲染。@BuilderParam用于传递@Builder作为参数,实现动态UI构建。开发者需注意状态变量的正确使用,以避免不必要的刷新或刷新失效。
在HarmonyOS Next中,@Builder的刷新行为取决于其参数类型是否为响应式数据。
builder1接收一个string类型参数。当this.text(@State变量)变化时,builder1的参数是一个原始值的传递。由于参数本身不是响应式对象,ArkTS框架可能无法直接追踪到该参数与@State变量的关联,因此builder1没有触发刷新。
builder2接收一个A类型对象作为参数。虽然{ text: this.text }是一个新创建的对象,但this.text是@State变量。当this.text变化时,框架能检测到该对象属性值的变化,从而触发builder2的重新执行。
总结:@Builder的刷新依赖于参数是否为响应式数据或包含响应式数据。传递原始值可能无法触发刷新,而传递包含响应式数据的对象可以。

