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

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

HarmonyOS
2024-09-02 11:13:29
浏览
收藏 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%') 
  } 
}

// 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 }) 
  } 
}
分享
微博
QQ
微信
回复
2024-09-02 16:10:13
相关问题
ArkTS如何把string转为byte数组
3027浏览 • 1回复 待解决
HarmonyOS 页面更新
23浏览 • 1回复 待解决
HarmonyOS 状态更新没有检测到
231浏览 • 1回复 待解决
HarmonyOS 修改状态栏颜色生效
311浏览 • 1回复 待解决
数组变量控制组件属性生效
1774浏览 • 1回复 待解决
HarmonyOS 状态变量刷新问题
494浏览 • 1回复 待解决
状态装饰器 ui刷新的问题
2465浏览 • 1回复 待解决
HarmonyOS JSON.parse 返回类型问题
442浏览 • 1回复 待解决