HarmonyOS 为什么@Link的属性变更不会触发UI刷新?

​子组件@Link content,定义BuilderParams buildContent(),并在build里调用。

父组件@State content,buildContent的实现,赋给子组件。

//这个是子组件​。

@Component  
export struct BaseDialog {  
  @Link title?:string | Resource  
  @Link content?:string | Resource//TODO 这里是关键  
  @Link buttons?:ButtonParams[]  
  
  refreshContent(content?:string | Resource) {  
    Logger.debug(TAG, "refreshContent(" + content + ") old=" + this.content)  
    this.content = content  
  }  
  
  @BuilderParam buildContent:($$:BaseDialog, content?:string | Resource)=>void  
  build() {  
    Column() {  
      this.buildContent(this, this.content)//TODO 这里是关键,为什么这里加了content,content变化为什么不会重新触发buildContent  
      )  
    }  
  }  
}

//这是父组件。

@CustomDialog  
export struct SendEmailDialog {  
  controller: CustomDialogController  
  @State title?: string|Resource = $r('app.string.send_email_title')  
  @State content?: string = ""//TODO 这里是关键  
  @State buttons?: ButtonParams[] = []  
  @State email?:string = ""  
  
  build() {  
    BaseDialog({  
      title:this.title,  
      content:this.content,  
      buildContent: overrideBuildContent,  
      buttons:this.buttons  
    })  
  }  
}

这是父组件文件中的一个builder函数(并不在父组件的struct里,在文件头部定义)。

@Builder  
function createDocTypeText($$:BaseDialog, text:string, selected:boolean, docType:string) {  
  Text(text)  
    .fontSize(18)  
    .fontWeight(FontWeight.Normal)  
    .fontColor(selected? $r('app.color.tag_selected') : $r('app.color.tag_unselected'))  
    .textAlign(TextAlign.Start)  
    .height($r('app.float.spacing_24'))  
    .borderColor(selected? $r('app.color.tag_selected') : $r('app.color.tag_unselected'))  
    .borderWidth(1)  
    .borderRadius(4)  
    .margin({right:$r("app.float.spacing_6")})  
    .padding({left:$r("app.float.spacing_8"), right:$r("app.float.spacing_8"), top:0, bottom:0})  
    .onClick((event)=>{  
      let params = SendEmailDialog.parse($$.content as string)  
      if (params) {  
        params.docType = docType  
        $$.refreshContent(SendEmailDialog.stringify(params))//TODO 这里是关键,更改了content为什么不会触发更新?  
        Logger.debug(TAG, "DocTypeText.onClick() result:" + $$.content)  
      }  
    })  
}
HarmonyOS
2024-10-29 11:19:23
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
FengTianYa

​@Builder按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新,您这边的demo进行的是值传递,因此不会引起UI的更新。参数传递规则:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-builder-V5#ZH-CN_TOPIC_0000001893210149__参数传递规则

分享
微博
QQ
微信
回复
2024-10-29 16:41:21
相关问题
UI预览不会自动刷新, 且刷新较慢
429浏览 • 1回复 待解决
数组中元素变更如何触发刷新list?
220浏览 • 1回复 待解决
嵌套Class属性变化无法触发UI渲染
205浏览 • 1回复 待解决
uiextension为什么不会避让顶部状态栏
665浏览 • 1回复 待解决
HarmonyOS 下面demo为什么点击不刷新
245浏览 • 1回复 待解决
HarmonyOS 主线程刷新UI
127浏览 • 1回复 待解决