咨询@ObservedV2装饰器 HarmonyOS 鸿蒙Next
咨询@ObservedV2装饰器 HarmonyOS 鸿蒙Next 【设备信息】Mate60
【API版本】Api13
【DevEco Studio版本】5.0.7.200
【问题描述】
在查看@ObservedV2文档时,其中在概述中有提到:@ObservedV2的类实例目前不支持使用JSON.stringify进行序列化。请问,该如何理解这句话?是因为序列化的时候,属性名被自动加上了__ob_前缀吗?
我有个需求,一些用户信息,一方面需要序列化保存在本地,一方面希望信息变化后(比如token),需要重新调用一些接口。想通过ObservedV2和Monitor提供的能力,来实现,这个问题应该怎么解决?
更多关于咨询@ObservedV2装饰器 HarmonyOS 鸿蒙Next的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这里是被@ObservedV2
标记的类及字段,使用JSON.stringify
之后字段名称都加上“_ob”开头的字段,导致无法反序列化回来,关于序列化后会有__ob_
前缀的问题,可以在序列前替换掉__ob_
前缀,demo如下
import { plainToClass } from "class-transformer";
@ObservedV2
class Son {
@Trace age: number = 100;
}
class Father {
son: Son = new Son();
}
@Entry
@Component
struct Index {
father: Father = new Father();
aboutToAppear(): void {
let a = JSON.stringify(this.father);
let b: Father = plainToClass(Father,this.father);
//{"son":{"__ob_age":100}}替换成{"son":{"age":100}}
console.log(JSON.stringify(convertKeysToCamelCase(this.father)))
}
build() {
Column() {
// 当点击改变age时,Text组件会刷新
Text(${this.father.son.age})
.onClick(() => {
this.father.son.age++;
})
}
}
}
// utils.ets
export function underscoreToCamelCase(underscoreString:string):string {
// 捕获`__ob_`替换成''
return underscoreString.replace(/(_ob)/g, (match:string, letter:string):string=> {
console.log(letter)
return '';
});
}
export function convertKeysToCamelCase(obj:ESObject):ESObject {
if (obj && typeof obj === 'object') {
const newObj:ESObject = {};
Object.keys(obj).forEach((key) => {
if (obj.hasOwnProperty(key)) {
const newKey = underscoreToCamelCase(key);
newObj[newKey] = convertKeysToCamelCase(obj[key]);
}
})
return newObj;
} else {
return obj;
}
}
更多关于咨询@ObservedV2装饰器 HarmonyOS 鸿蒙Next的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
@ObservedV2
装饰器是HarmonyOS鸿蒙Next中用于实现数据观察和响应式编程的机制。它主要用于标记类,使其成为可观察的数据源。当被@ObservedV2
装饰的类中的属性发生变化时,依赖这些属性的UI组件会自动更新。
@ObservedV2
装饰器通常与@Track
或@Watch
等装饰器配合使用,用于定义哪些属性或方法需要被追踪或监听。通过这种方式,开发者可以更高效地管理UI状态和数据流。
在鸿蒙Next中,@ObservedV2
的使用示例如下:
@ObservedV2
class User {
name: string = "John";
age: number = 30;
}
@Entry
@Component
struct UserProfile {
@State user: User = new User();
build() {
Column() {
Text(`Name: ${this.user.name}`)
Text(`Age: ${this.user.age}`)
Button('Update Age')
.onClick(() => {
this.user.age += 1;
})
}
}
}
在这个示例中,User
类被@ObservedV2
装饰,表示它是一个可观察的数据源。当user
对象的age
属性发生变化时,UI会自动更新显示新的年龄值。
@ObservedV2
装饰器的引入简化了数据绑定和状态管理,使得开发者能够更专注于业务逻辑的实现。