HarmonyOS 鸿蒙Next关于复杂嵌套对象属性更改失效的问题

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next关于复杂嵌套对象属性更改失效的问题

我的数据结构如下:

@Observed
export class ContractListViewModel {
  unitList: UnitData[] = [];
  // identityList: IdentityData[] = [];
  identityList: IdentityListArray = new IdentityListArray();
  unitFlagViewModel: UnitFlagViewModel = new UnitFlagViewModel('', '')
  breadCrumbArray: string[] = []
}

@Observed
export class IdentityListArray extends Array<IdentityData> {
}

@Observed
export class IdentityData {
  id: string = '';
  pinyin: string = '';
  pinyinInitial: string = '';
  name: string = '';
  unique: string = '';
  distinguishedName: string = '';
  person: string = '';
  unit: string = '';
  unitName: string = '';
  unitLevel: number = 0;
  unitLevelName: string = '';
  orderNumber: number = 0;
  major: boolean = false;
  createTime: string = '';
  updateTime: string = '';
  icon: Resource | PixelMap = $r('app.media.icon_contract_gender_unknow');
}

现在我修改icon属性,属于复杂嵌套的场景

this.contractListViewModel.identityList[start.itemIndexInGroup! + i].icon = $r('app.media.icon_contract_gender_male')

在一级页面定义如下:

@State contractListViewModel: ContractListViewModel = new ContractListViewModel();
PersonListView({ identityListArray: this.contractListViewModel.identityList })

PersonListView子组件定义如下:

@ObjectLink identityListArray: IdentityListArray;
PersonListItemView({ identityData: item })

PersonListItemView子组件定义如下:

@ObjectLink identityData: IdentityData;
Image(this.identityData.icon)
  .width(33)
  .height(33)
  .margin(10)

更改我的icon属性,UI并没有刷新,请问是什么原因


更多关于HarmonyOS 鸿蒙Next关于复杂嵌套对象属性更改失效的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

我按照你提供demo试了一下 是可以的

唯一的区别就是声明完这个变量之后

@State contractListViewModel: ContractListViewModel = new ContractListViewModel();

我初始化了一下identityList的值

aboutToAppear(): void {
  this.contractListViewModel.identityList.push(new IdentityData());
}

我把整个demo贴一下 你本地运行一下

@Entry
@Component
struct Test4 {
  @State contractListViewModel: ContractListViewModel = new ContractListViewModel();

  aboutToAppear(): void {
    this.contractListViewModel.identityList.push(new IdentityData());
  }

  build() {
    Column() {
      PersonListView({ identityListArray: this.contractListViewModel.identityList })
      Button() {
        Text("测试变更图片")
      }.onClick(() => {
        this.contractListViewModel.identityList[0].icon = $r("app.media.home")
      }).margin(50)
    }
    .height('100%')
    .width('100%')
  }
}

@Component
struct PersonListView {
  @ObjectLink identityListArray: IdentityListArray;

  build() {
    Column() {
      ForEach(this.identityListArray, (item: IdentityData) => {
        PersonListItemView({ identityData: item })
      })
    }
  }
}

@Component
struct PersonListItemView {
  @ObjectLink identityData: IdentityData;

  build() {
    Image(this.identityData.icon)
      .width(33)
      .height(33)
  }
}

@Observed
export class ContractListViewModel {
  identityList: IdentityListArray = new IdentityListArray();
  breadCrumbArray: string[] = []
}

@Observed
export class IdentityListArray extends Array<IdentityData> {
}

@Observed
export class IdentityData {
  id: string = '';
  pinyin: string = '';
  pinyinInitial: string = '';
  name: string = '';
  unique: string = '';
  distinguishedName: string = '';
  person: string = '';
  unit: string = '';
  unitName: string = '';
  unitLevel: number = 0;
  unitLevelName: string = '';
  orderNumber: number = 0;
  major: boolean = false;
  createTime: string = '';
  updateTime: string = '';
  icon: Resource | PixelMap = $r('app.media.background');
}

更多关于HarmonyOS 鸿蒙Next关于复杂嵌套对象属性更改失效的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


是的 这个IdentityData必须得new一下才行,

关于HarmonyOS 鸿蒙Next中复杂嵌套对象属性更改失效的问题,这通常与数据绑定机制或对象引用处理不当有关。以下是一些可能的解决方案概述:

  1. 确保数据绑定正确:检查你的数据绑定逻辑,确保嵌套对象的属性更改能够正确触发视图更新。在HarmonyOS中,你可能需要确保使用了正确的属性监听器或观察者模式来捕捉属性变化。

  2. 深拷贝与浅拷贝:在修改嵌套对象属性时,注意是否因为浅拷贝导致原对象引用未更新。确保在需要时执行深拷贝,以避免引用问题导致的属性更改失效。

  3. 对象生命周期管理:检查嵌套对象的生命周期管理,确保在对象被销毁或替换前,属性更改能够正确应用。在某些情况下,对象可能在视图中被重新创建,导致之前的更改丢失。

  4. 多线程访问:如果你的应用涉及多线程操作,确保对嵌套对象的访问是线程安全的。避免在多个线程中同时修改同一对象,这可能导致数据不一致或更改失效。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部