HarmonyOS LazyForEach 局部数据不刷新问题?

我使用LazyForEach显示一个用户列表,当我在列表中更改用户对象的一个属性时,调用onDataChange页面不刷新,调用onDataDelete却刷新了,为什么这么反常理呢?或者说正确的局部刷新方式是什么?

阅读 469
1 个回答

下方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 })
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进