HarmonyOS model变化如何触发WrapperBuilder重建?

我们有一个viewModel,持有subViewModel,subViewModel持有wrapperBuilder(用于构建视图)。在index中,我们初始化了viewModel,并把它传递给了ViewComponent。ViewComponent依赖了subViewModel进行视图构建。我们在Index的click事件中,更改了subViewModel,期望ViewCompnent中的对应视图能重新构建,可是没有成功,请问怎么写可以触发重新构建呢?

demo以增加,具体是该行代码

this.viewModel?.subViewModel?.pageBuilder?.builder(this.viewModel.subViewModel)

在subViewModel变化时,没有重新构建。

期望这行代码可以重新构建。

HarmonyOS
2025-01-09 16:21:15
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

Builder重新整体赋值时不能刷新,本身没有这个能力,现在可通过状态变量强制刷新

// Index.ets
import { AppPageBuilder } from '../Model/AppPageBuilder';
import { SubViewModel } from '../Model/SubViewModel';
import { ViewModel } from '../Model/ViewModel';
import { ViewComponent } from './ViewComponent';
import promptAction from '@ohos.promptAction';

let type = 0

@Entry
@ComponentV2
struct Index {
  message: string = 'Hello World';
  viewModel: ViewModel = new ViewModel()


  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
      ViewComponent({viewModel: this.viewModel})
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
    .onClick((event?: ClickEvent) => {
      if (this.viewModel) {
        promptAction.showToast({
          message: `type = ${type}`,
          duration: 200
        })
        this.viewModel.subViewModel = new AppPageBuilder().createPageModel((type == 0 || type == 1) ? 0 : 1)
        this.viewModel.subViewModel!.text = `type = ${type}`;
        this.viewModel.a = !this.viewModel.a;
        type++
        if (type > 6) {
          type = 0
        }
      }
    })
  }
}

// ViewModel.ets
import { AppPageBuilder } from './AppPageBuilder'
import { SubViewModel } from './SubViewModel'

@ObservedV2
export class ViewModel {
  @Trace
  subViewModel: SubViewModel | null = new AppPageBuilder().createPageModel(0)
  @Trace a:boolean = false;
}

// ViewComponent
import { AppPageBuilder } from '../Model/AppPageBuilder'
import { SubViewModel } from '../Model/SubViewModel'
import { ViewModel } from '../Model/ViewModel'

@ComponentV2
export struct ViewComponent {
  @Param viewModel: ViewModel | null = null

  build() {
    Stack(){
      // 期望3种属性都重新构建
      //this.viewModel?.subViewModel?.pageBuilder?.builder({text: this.viewModel.subViewModel.text, pageBuilder: this.viewModel.subViewModel.pageBuilder})
      if(this.viewModel?.a){
        this.viewModel?.subViewModel?.pageBuilder?.builder(this.viewModel.subViewModel)
        Text(this.viewModel?.subViewModel?.text)

      } else {
        this.viewModel?.subViewModel?.pageBuilder?.builder(this.viewModel.subViewModel)
        Text(this.viewModel?.subViewModel?.text)

      }
    }
    .width('100%')
    .height('100%')
  }
}
分享
微博
QQ
微信
回复
2025-01-09 18:06:30
相关问题
HarmonyOS 关于WrapperBuilder更新问题
296浏览 • 1回复 待解决
RDS MYSQL 如何重建索引
3085浏览 • 1回复 待解决
嵌套Class的属性变化无法触发UI渲染
712浏览 • 1回复 待解决
HarmonyOS 关于json转model的处理
419浏览 • 1回复 待解决
HarmonyOS 换成model后动画放大实现不了
285浏览 • 1回复 待解决
API version 8 does not support the Stage model
8635浏览 • 1回复 待解决
HarmonyOS 如何使用代码触发震动
181浏览 • 1回复 待解决