HarmonyOS代码封装解决方案

使用这个Observed 和 ObjectLink进行进行双向数据同步,一般的实际使用场景 返回的数据是json 如果要使用的话就要对实例类进行new 和 constructor的实现 直接进行JSON.parse获得对象的话并不能响应Observed 和 ObjectLink。每个类都这样做比较麻烦 想用一种通用方式来写 (包括 不用每个类的属性都写一遍赋值,在接口数据返回范型处统一实现new,类似一个json转对象方法),这边有什么方案吗?

HarmonyOS
2024-08-27 14:15:34
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

可以通过引入三方库 reflect-metadata 和 class-transformer,参考如下demo实现。

Index.ets:

import { plainToClass, Type } from 'class-transformer'; 
import 'reflect-metadata'; 
import { Person, ViewA } from './ViewA'; 
 
class ResponseObj { 
  @Type(() => Person) 
  data: Person[] = []; 
} 
 
@Entry 
@Component 
struct Index { 
  @State list: Person[] = []; 
  @State message: string = 'Click me'; 
 
  aboutToAppear(): void { 
    let str = '{"data" : [{"number" :1,"age": 20, "testA": { "str" : "123"}},{"number" :2,"age": 21,"testA": {"str" : "456"}}]}' 
    let jsonData: ESObject = JSON.parse(str) 
    let responseObj: ResponseObj = plainToClass(ResponseObj, jsonData); 
    console.log( `${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, 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-08-27 17:54:04
相关问题
HarmonyOS事件通信能力解决方案
369浏览 • 1回复 待解决
HarmonyOS有访问相册有解决方案
88浏览 • 1回复 待解决
确认网络状况解决方案
126浏览 • 1回复 待解决
高级图表实现解决方案
286浏览 • 1回复 待解决
HarmonyOS C++模块引用解决方案
74浏览 • 1回复 待解决
抓包应用,求解决方案
1536浏览 • 1回复 待解决
HarmonyOS 音视频处理相关解决方案
118浏览 • 1回复 待解决
lazyforeach替换数据源解决方案
357浏览 • 1回复 待解决
应用包体积大小优化解决方案
184浏览 • 1回复 待解决
图片存储解决方案谁知道啊?
2286浏览 • 1回复 待解决
webview中跨域问题解决方案
1310浏览 • 1回复 待解决
Harmony API9之后 GIS 解决方案有哪些?
1981浏览 • 1回复 待解决
List滚动条时长时短,求解决方案
726浏览 • 1回复 待解决
图像处理库是否有替代的解决方案
93浏览 • 0回复 待解决