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