HarmonyOS 鸿蒙Next中@Builder的构造无法接收刷新的数据吗?
HarmonyOS 鸿蒙Next中@Builder的构造无法接收刷新的数据吗?
import { HMRouter } from '@hadss/hmrouter';
@HMRouter({pageUrl:'test2'})
@Component
export struct TestPage2 {
@State li:string[] = []
build() {
Column(){
List(){
ListItem(){
Button('增加')
.onClick(() => {
this.li.push('增加')
})
}
ListItem(){
// Column(){
// List(){
// ForEach(this.li,(str:string) => {
// ListItem(){
// Text(str)
// }
// })
// }
// }
this.testBuilder(this.li)
}
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
[@Builder](/user/Builder)
testBuilder(str:string[]) {
Column(){
List(){
ForEach(str,(item:string) => {
ListItem(){
Text(item)
}
})
}
}
}
}
将注释部分的代码用下面的Builder替代的话点击"增加"button不会显示增加的新的内容,但是用原来注释的内容就可以显示,这个是为什么呢?
更多关于HarmonyOS 鸿蒙Next中@Builder的构造无法接收刷新的数据吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【解决方案】
在@Builder函数中,当传递的参数为状态变量时,状态变量的改变不会引起@Builder函数内的UI刷新。所以当使用状态变量的时候,推荐使用按引用传递,按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder函数内的UI刷新,可以参考官网按引用传递参数。
结合以上问题提供的代码,修改后如下:
// import { HMRouter } from '@hadss/hmrouter';
// @HMRouter({pageUrl:'test2'})
class Tmp {
paramA1: string[] = [];
}
@Entry
@Component
export struct TestPage2 {
@State li:string[] = []
build() {
Column(){
List(){
ListItem(){
Button('增加')
.onClick(() => {
this.li.push('增加')
})
}
ListItem(){
// Column(){
// List(){
// ForEach(this.li,(str:string) => {
// ListItem(){
// Text(str)
// }
// })
// }
// }
this.testBuilder({paramA1:this.li})
}
}
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
@Builder
testBuilder(str:Tmp) {
Column(){
List(){
ForEach(str.paramA1,(item:string) => {
ListItem(){
Text(item)
}
})
}
}
}
}
更多关于HarmonyOS 鸿蒙Next中@Builder的构造无法接收刷新的数据吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,@Builder
函数默认不会自动响应状态变量的变化。当@State
变量li
被修改时,虽然组件会重新构建,但@Builder
函数内部不会自动感知到参数str
的变化。
这是因为@Builder
函数在构建时捕获的是参数的当前值,而不是建立响应式依赖。当li
数组通过push
方法更新时,@Builder
函数不会自动重新执行。
解决方案是使用@BuilderParam
配合状态管理,或者直接在build
方法内使用ForEach
来确保响应式更新。注释代码能正常工作的原因是ForEach
直接引用了@State
变量li
,建立了响应式关联。
建议将@Builder
改为内联构建,或者使用@BuilderParam
来传递构建逻辑,而不是直接传递数据参数。