HarmonyOS 鸿蒙Next 使用对象字面量或使用JSON.parse创建的对象无法管理状态更新,仅new出的对象可更新

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 使用对象字面量或使用JSON.parse创建的对象无法管理状态更新,仅new出的对象可更新 看文档说 @ObservedV2 类装饰器,只能被使用 new 创建类的对象才能被状态管理观测到。但是在实际开发中,大多情况可能会通过对象字面量的方式或者通过 JSON.parse 的方式来给对象赋值,这样便不能被管理状态更新,使用起来非常不方便,所以后续有没有支持这种能力的更新计划。

2 回复

json转自定义class对象时,需要将class对象new出来,这样才是真正转成了class对应的model。如果数据结构比较复杂,数据量比较大,不想在解析的时候,每个对象都new一次,建议使用第三库reflect-metadata 和 class-transformer,

安装方法:

npm install class-transformer
npm install reflect-metadata

参考代码:

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" : [{"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, 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 })
  }
}

更多关于HarmonyOS 鸿蒙Next 使用对象字面量或使用JSON.parse创建的对象无法管理状态更新,仅new出的对象可更新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙系统中,使用对象字面量或JSON.parse创建的对象无法管理状态更新,而仅通过new关键字创建的对象可以更新状态的问题,通常与对象的引用和内存管理机制有关。

在鸿蒙系统中,状态管理通常依赖于对象的唯一引用和生命周期管理。当使用对象字面量或JSON.parse创建对象时,这些对象可能是在不同的内存区域或作用域内被创建的,导致系统无法正确追踪和更新这些对象的状态。这些对象可能被视为临时或浅拷贝,因此其状态变化不会被系统记录或响应。

相反,通过new关键字创建的对象是在堆内存中分配的,具有明确的生命周期和引用计数,系统可以准确地追踪这些对象的状态变化。因此,当这些对象的状态发生变化时,系统能够及时响应并更新UI或执行其他相关操作。

为了确保状态管理的正确性,建议在鸿蒙系统中使用new关键字来创建需要管理状态的对象。这样可以确保对象具有正确的生命周期和引用管理,从而避免状态更新问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部