HarmonyOS ObjectLinkJSON.parse转为数组状态不更新

JSON.parse转为数组后,对象属性更新后,状态不更新,但是如果数组的对象是new出来的更新属性后状态没问题

HarmonyOS
2024-09-02 11:13:29
1049浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
put_get

因为JSON转出来的对象只是类型断言,不是class构造的真正实例,可以通过引入三方库 reflect-metadata 和 class-transformer 来实现json对象转指定实例。

reflect-metadata 地址:

https://ohpm.openharmony.cn/#/cn/detail/reflect-metadata

// Index.ets

let jsonString:Record<string, ESObject> = { 
  "data" : [ 
    { 
      "number" :1, 
      "age": 20, 
      "testA": { 
        "str" : "123" 
      } 
    }, 
    { 
      "number" :2, 
      "age": 21, 
      "testA": { 
        "str" : "456" 
      } 
    } 
  ] 
} 
 
import { Type, plainToClass } from 'class-transformer' 
import 'reflect-metadata' 
import { TestA, Person, ViewA} from './ViewA'; 
class ResponseObj { 
  @Type (() => Person) 
  data: Person[] = []; 
} 
@Entry 
@Component 
struct Index { 
  @State list: Person[] = []; 
  @State message: string = 'Click me'; 
  build() { 
    Row() { 
      Column() { 
        Text(this.message).fontSize(40).onClick(() => { 
          let responseObj : ResponseObj = plainToClass(ResponseObj, jsonString); 
          console.log( ${responseObj.data[0] instanceof Person}) 
          this.list = this.list.concat(responseObj.data); 
        }) 
        ForEach(this.list, (item : Person, index: number) => { 
          ViewA({index:index, testA: item.testA}) 
        }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

// ViewA.ets

import { Type } from 'class-transformer' 
@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('') 
} 
@Component 
export struct ViewA { 
  @ObjectLink testA: TestA 
  index: number = -1; 
  build() { 
    Row(){ 
      Button(View A ${this.testA.str}).onClick(() =>{ 
        this.index += 1; 
        this.testA.str = ${this.index} : Test A String 
      }) 
    }.margin({top : 10 }) 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
分享
微博
QQ
微信
回复
2024-09-02 16:10:13


相关问题
HarmonyOS 本地文件如何转为byte数组
602浏览 • 1回复 待解决
ArkTS如何把string转为byte数组
3932浏览 • 1回复 待解决
HarmonyOS 视图更新
536浏览 • 1回复 待解决
HarmonyOS 页面更新
576浏览 • 1回复 待解决
HarmonyOS 卡片更新图片刷新
867浏览 • 1回复 待解决
HarmonyOS 状态更新没有检测到
958浏览 • 1回复 待解决
HarmonyOS 更新数据后UI刷新
1021浏览 • 1回复 待解决
HarmonyOS @objectLink+@observe父组件更新
490浏览 • 1回复 待解决
为什么数组下标越界闪退?
291浏览 • 0回复 待解决
【列表数据更新后页面刷新】
356浏览 • 1回复 待解决
HarmonyOS 修改状态栏颜色生效
1083浏览 • 1回复 待解决
提问
该提问已有2人参与 ,帮助了55人