HarmonyOS 如何实现根据数组元素对象属性的变化同步更新UI

@Observed
class WindowStatus {
  viewType: number = 0;
}

@Component
export struct TestPage {
  @State windowStatusArr: WindowStatus[] = [
    new WindowStatus(),
    new WindowStatus(),
    new WindowStatus(),
    new WindowStatus()
  ]

  build() {
    Column() {
      Button('change view type')
        .onClick(() => {
          this.windowStatusArr[0].viewType = 1;
        })

      if (this.windowStatusArr[0].viewType == 0) {
        Text('ViewType 0')
      } else if (this.windowStatusArr[0].viewType == 1) {
        Text('ViewType 1')
      }
    }
  }
}

在以上代码中点击按钮后更改viewType,但是UI并没有刷新,要便捷的实现该业务场景,应该如何实现?

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

下方demo使用第三方库reflect-metadata和class-transformer,安装方法:

ohpm install class-transformer
ohpm install reflect-metadata

可同时用@Observed和@ObjectLink,参考示例如下:

import 'reflect-metadata';
import { plainToClass, Type } from 'class-transformer';

class ResponseObj {
  @Type(() => Person)
  data: Person[] = [];
}

@Entry
@Component
struct Index9 {
  @State list: Person[] = [];
  @State message: string = 'Click me';

  aboutToAppear(): void {
    let str =
      '{"data" : [{"count" :1,"number" :1, "testA": { "str" : "123"}},{"count" :1,"number" :2,"age": 21,"testA": {"str" : "456"}},{"count" :1,"number" :3,"age": 22,"testA": {"str" : "789"}}]}'
    let jsonData: ESObject = JSON.parse(str)
    let responseObj: ResponseObj = plainToClass(ResponseObj, jsonData);
    console.log(`test====${responseObj.data[0] instanceof Person}`)
    this.list = this.list.concat(responseObj.data);
  }

  build() {
    Row() {

      Column() {
        ForEach(this.list, (item: Person, index: number) => {
          ViewA({ index: index, age: item.hasAge(), testA: item.testA })
        })
      }
      .width('100%')
    }
    .height('100%')
  }
}

@Observed
export class TestA {
  public str: string

  constructor(str: string) {
    this.str = str;
  }
}

export class Person {
  name: string = ''
  age: number = 1
  @Type(() => TestA)
  testA: TestA = new TestA('')

  hasAge(): number {
    return this.age
  }
}

@Component
export struct ViewA {
  @ObjectLink testA: TestA
  index: number = -1;
  age: number = 0

  build() {
    Row() {
      Button(`View A  ${this.testA.str}`).onClick(() => {
        this.index += 1;
        this.testA.str = `${this.index} : Test A String ${this.age}`
      })
    }.margin({ top: 10 })
  }
}
分享
微博
QQ
微信
回复
2025-01-09 19:21:55
相关问题
如何监听数组对象属性变化
2734浏览 • 1回复 待解决
数组列表如何实现数据双向同步
825浏览 • 1回复 待解决
HarmonyOS 嵌套数组元素UI刷新方案
685浏览 • 1回复 待解决
嵌套Class属性变化无法触发UI渲染
703浏览 • 1回复 待解决