1# @ohos.arkui.StateManagement (状态管理) 2 3状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态、工具。 4 5>**说明:** 6> 7>本模块首批接口从API version 12开始支持,后续版本的新增接口,采用上角标单独标记接口的起始版本。 8 9 10本文中T和S的含义如下: 11 12 13| 类型 | 说明 | 14| ---- | -------------------------------------- | 15| T | Class,number,boolean,string和这些类型的数组形式。 | 16| S | number,boolean,string。 | 17 18 19## 导入模块 20 21```ts 22import { AppStorageV2,PersistenceV2,UIUtils} from '@kit.ArkUI'; 23``` 24 25## AppStorageV2 26 27AppStorageV2具体UI使用说明,详见[AppStorageV2(应用全局的UI状态存储)](../../ui/state-management/arkts-new-appstoragev2.md)。 28 29**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 30 31**系统能力:** SystemCapability.ArkUI.ArkUI.Full 32 33### connect 34 35static connect\<T extends object\>( </br > 36 type: TypeConstructorWithArgs\<T\>, </br > 37 keyOrDefaultCreator?: string | StorageDefaultCreator\<T\>, </br > 38 defaultCreator?: StorageDefaultCreator\<T\> </br > 39): T | undefined 40 41将键值对数据储存在应用内存中。如果给定的key已经存在于[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。 42 43**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 44 45**系统能力:** SystemCapability.ArkUI.ArkUI.Full 46 47**参数:** 48 49| 参数名 | 类型 | 必填 | 说明 | 50| -------- | ------ | ---- | ---------------------- | 51| type | [TypeConstructorWithArgs\<T\>](#typeconstructorwithargst) | 是 | 指定的类型,若未指定key,则使用type的name作为key。 | 52| keyOrDefaultCreator | string \| [StorageDefaultCreator\<T\>](#storagedefaultcreatort) | 否 | 指定的key,或者是获取默认值的构造器。 | 53| defaultCreator | StorageDefaultCreator\<T\> | 否 | 获取默认值的构造器。 | 54 55>**说明:** 56> 57>1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器; 58> 59>2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常; 60> 61>3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配; 62> 63>4、key建议使用有意义的值,长度不超过255,使用非法字符或空字符的行为是未定义的。 64 65**返回值:** 66 67| 类型 | 说明 | 68| -------------------------------------- | ------------------------------------------------------------ | 69| T | 创建或获取AppStorageV2数据成功时,返回数据;否则返回undefined。 | 70 71**示例:** 72 73```ts 74import { AppStorageV2 } from '@kit.ArkUI'; 75 76@ObservedV2 77class SampleClass { 78 @Trace p: number = 0; 79} 80 81// 将key为SampleClass、value为new SampleClass()对象的键值对存储到内存中,并赋值给as1 82const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass()); 83 84// 将key为key_as2、value为new SampleClass()对象的键值对存储到内存中,并赋值给as2 85const as2: SampleClass = AppStorageV2.connect(SampleClass, 'key_as2', () => new SampleClass())!; 86 87// key为SampleClass已经在AppStorageV2中,将key为SampleClass的值返回给as3 88const as3: SampleClass = AppStorageV2.connect(SampleClass) as SampleClass; 89``` 90 91### remove 92 93static remove\<T\>(keyOrType: string | TypeConstructorWithArgs\<T\>): void 94 95将指定的键值对数据从[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)里面删除。如果指定的键值不存在于AppStorageV2中,将删除失败。 96 97**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 98 99**系统能力:** SystemCapability.ArkUI.ArkUI.Full 100 101**参数:** 102 103| 参数名 | 类型 | 必填 | 说明 | 104| -------- | ------ | ---- | ---------------------- | 105| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是 | 需要删除的key;如果指定的是type类型,删除的key为type的name。 | 106 107>**说明:** 108> 109>删除AppStorageV2中不存在的key会报警告。 110 111 112**示例:** 113 114<!--code_no_check--> 115```ts 116// 假设AppStorageV2中存在key为key_as2的键,从AppStorageV2中删除该键值对数据 117AppStorageV2.remove('key_as2'); 118 119// 假设AppStorageV2中存在key为SampleClass的键,从AppStorageV2中删除该键值对数据 120AppStorageV2.remove(SampleClass); 121 122// 假设AppStorageV2中不存在key为key_as1的键,报警告 123AppStorageV2.remove('key_as1'); 124``` 125 126### keys 127 128static keys(): Array\<string\> 129 130获取[AppStorageV2](../../ui/state-management/arkts-new-appstoragev2.md)中的所有key。 131 132**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 133 134**系统能力:** SystemCapability.ArkUI.ArkUI.Full 135 136**返回值:** 137 138| 类型 | 说明 | 139| -------------------------------------- | ------------------------------------------------------------ | 140| Array\<string\> | 所有AppStorageV2中的key。 | 141 142>**说明:** 143> 144>key在Array中的顺序是无序的,与key插入到AppStorageV2中的顺序无关。 145 146**示例:** 147 148```ts 149// 假设AppStorageV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys 150const keys: Array<string> = AppStorageV2.keys(); 151``` 152 153 154 155## PersistenceV2 156 157继承自[AppStorageV2](#appstoragev2),PersistenceV2具体UI使用说明,详见[PersistenceV2(持久化存储UI状态)](../../ui/state-management/arkts-new-persistencev2.md)。 158 159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 160 161**系统能力:** SystemCapability.ArkUI.ArkUI.Full 162 163### globalConnect<sup>18+</sup> 164 165static globalConnect\<T extends object\>(type: ConnectOptions\<T\>): T | undefined 166 167将键值对数据储存在应用磁盘中。如果给定的key已经存在于[PersistenceV2](../../ui/state-management/arkts-new-persistencev2.md)中,返回对应的值;否则,会通过获取默认值的构造器构造默认值,并返回。如果globalConnect的是\@ObservedV2对象,该对象\@Trace属性的变化,会触发整个关联对象的自动刷新;非\@Trace属性变化则不会,如有必要,可调用PersistenceV2.save接口手动存储。 168 169**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 170 171**系统能力:** SystemCapability.ArkUI.ArkUI.Full 172 173| 名称 |类型 |必填 | 说明 | 174| ------------- | ------------|-------------------|-------------------------- | 175| type |[ConnectOptions\<T\>](#connectoptions18) |是 |传入的connect参数,详细说明见ConnectOptions参数说明。 | 176 177**返回值:** 178 179|类型 |说明 | 180|----------|-----------------------------------| 181|T \| undefined |创建或获取数据成功时,返回数据;否则返回undefined。 | 182 183> **说明:** 184> 185> 1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器)。 186> 187> 2、确保数据已经存储在PersistenceV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常。 188> 189> 3、同一个key,globalConnect不同类型的数据会导致应用异常,应用需要确保类型匹配。 190> 191> 4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的。 192> 193> 5、关联[\@Observed](../../ui/state-management/arkts-observed-and-objectlink.md)对象时,因为该类型的name属性未定义,需要指定key或者自定义name属性。 194> 195> 6、数据的存储路径为应用级别,不同module使用相同的key和相同的加密分区进行globalConnect,存储的数据副本应用仅有一份。 196> 197> 7、globalConnect使用同一个key但设置了不同的加密级别,数据为第一个使用globalConnect的加密级别,并且PersistenceV2中的数据也会存入最先使用key的加密级别。 198> 199> 8、connect和globalConnect不建议混用,因为数据副本路径不同,如果混用,则key不可以一样,否则会crash。 200> 201> 9、EL5加密要想生效,需要开发者在module.json中配置字段ohos.permission.PROTECT_SCREEN_LOCK_DATA,使用说明见[声明权限](../../security/AccessToken/declare-permissions.md)。 202 203**示例:** 204 205<!--code_no_check--> 206```ts 207import { PersistenceV2, Type, ConnectOptions } from '@kit.ArkUI'; 208import { contextConstant } from '@kit.AbilityKit'; 209 210@ObservedV2 211class SampleChild { 212 @Trace childId: number = 0; 213 groupId: number = 1; 214} 215 216@ObservedV2 217export class Sample { 218 // 对于复杂对象需要@Type修饰,确保序列化成功 219 @Type(SampleChild) 220 @Trace father: SampleChild = new SampleChild(); 221} 222 223// key不传入尝试用为type的name作为key,加密参数不传入默认加密等级为EL2 224@Local p: Sample = PersistenceV2.globalConnect({type: Sample, defaultCreator:() => new Sample()})!; 225 226// 使用key:global1连接,传入加密等级为EL1 227@Local p1: Sample = PersistenceV2.globalConnect({type: Sample, key:'global1', defaultCreator:() => new Sample(), areaMode: contextConstant.AreaMode.EL1})!; 228 229// 使用key:global2连接,使用构造函数形式,加密参数不传入默认加密等级为EL2 230@Local p2: Sample = PersistenceV2.globalConnect({type: Sample, key: 'global2', defaultCreator:() => new Sample()})!; 231 232// 使用key:global3连接,直接写加密数值,范围只能在0-4,否则运行会crash,例如加密设置为EL3 233@Local p3: Sample = PersistenceV2.globalConnect({type: Sample, key:'global3', defaultCreator:() => new Sample(), areaMode: 3})!; 234 235``` 236 237### save 238 239static save\<T\>(keyOrType: string | TypeConstructorWithArgs\<T\>): void 240 241将指定的键值对数据持久化一次。 242 243**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 244 245**系统能力:** SystemCapability.ArkUI.ArkUI.Full 246 247**参数:** 248 249| 参数名 | 类型 | 必填 | 说明 | 250| -------- | ------ | ---- | ---------------------- | 251| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是 | 需要持久化的key;如果指定的是type类型,持久化的key为type的name。 | 252 253>**说明:** 254> 255>由于非[\@Trace](../../ui/state-management/arkts-new-observedV2-and-trace.md)的数据改变不会触发[PersistenceV2](../../ui/state-management/arkts-new-persistencev2.md)的自动持久化,如有必要,可调用该接口持久化对应key的数据。 256> 257>手动持久化当前内存中不处于connect状态的key是无意义的。 258 259**示例:** 260 261<!--code_no_check--> 262 263```ts 264// 假设PersistenceV2中存在key为key_as2的键,持久化该键值对数据 265PersistenceV2.save('key_as2'); 266 267// 假设PersistenceV2中存在key为SampleClass的键,持久化该键值对数据 268PersistenceV2.remove(SampleClass); 269 270// 假设PersistenceV2中不存在key为key_as1的键,无意义的操作 271PersistenceV2.remove('key_as1'); 272``` 273 274### notifyOnError 275 276static notifyOnError(callback: PersistenceErrorCallback | undefined): void 277 278在持久化失败时调用。 279 280**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 281 282**系统能力:** SystemCapability.ArkUI.ArkUI.Full 283 284**参数:** 285 286| 参数名 | 类型 | 必填 | 说明 | 287| -------- | ------ | ---- | ---------------------- | 288| callback | PersistenceErrorCallback \| undefined | 是 | 持久化失败时调用。 | 289 290**示例:** 291 292```ts 293// 持久化失败时调用 294PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => { 295 console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`); 296}); 297``` 298 299## ConnectOptions<sup>18+</sup> 300 301**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 302 303**系统能力:** SystemCapability.ArkUI.ArkUI.Full 304 305|名称 |类型 |只读 |可选 |说明 | 306|--------|------------|------------|-----------|--------------| 307|type | TypeConstructorWithArgs\<T\> |否 |否 |指定的类型。 | 308|key | string |否 |是 |传入的key,不传则使用type的名字作为key。 | 309|defaultCreator | StorageDefaultCreator\<T\> |否 |是 |默认数据的构造器,建议传递,如果globalConnect是第一次连接key,不传会报错。 | 310|areaMode | contextConstant.AreaMode |否 |是 |加密级别:EL1-EL5,详见[加密级别](../../application-models/application-context-stage.md#获取和修改加密分区),对应数值:0-4,不传时默认为EL2,不同加密级别对应不同的加密分区,即不同的存储路径,传入的加密等级数值不在0-4会直接运行crash。 | 311 312## UIUtils 313 314UIUtils提供一些方法,用于处理状态管理相关的数据转换。 315 316**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 317 318**系统能力:** SystemCapability.ArkUI.ArkUI.Full 319 320### getTarget 321 322static getTarget\<T extends object\>(source: T): T 323 324从状态管理框架包裹的代理对象中获取原始对象。详见[getTarget接口:获取状态管理框架代理前的原始对象](../../ui/state-management/arkts-new-getTarget.md)。 325 326**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 327 328**系统能力:** SystemCapability.ArkUI.ArkUI.Full 329 330**参数:** 331 332| 参数名 | 类型 | 必填 | 说明 | 333| ------ | ---- | ---- | ------------ | 334| source | T | 是 | 数据源对象。 | 335 336**返回值:** 337 338| 类型 | 说明 | 339| ---- | ------------------------------------------------ | 340| T | 数据源对象去除状态管理框架所加代理后的原始对象。 | 341 342**示例:** 343 344```ts 345import { UIUtils } from '@kit.ArkUI'; 346class NonObservedClass { 347 name: string = "Tom"; 348} 349let nonObservedClass: NonObservedClass = new NonObservedClass(); 350@Entry 351@Component 352struct Index { 353 @State someClass: NonObservedClass = nonObservedClass; 354 build() { 355 Column() { 356 Text(`this.someClass === nonObservedClass: ${this.someClass === nonObservedClass}`) // false 357 Text(`UIUtils.getTarget(this.someClass) === nonObservedClass: ${UIUtils.getTarget(this.someClass) === 358 nonObservedClass}`) // true 359 } 360 } 361} 362``` 363### makeObserved 364 365static makeObserved\<T extends object\>(source: T): T 366 367将普通不可观察数据变为可观察数据。详见[makeObserved接口:将非观察数据变为可观察数据](../../ui/state-management/arkts-new-makeObserved.md)。 368 369**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 370 371**系统能力:** SystemCapability.ArkUI.ArkUI.Full 372 373**参数:** 374 375| 参数名 | 类型 | 必填 | 说明 | 376| ------ | ---- | ---- | ------------ | 377| source | T | 是 | 数据源对象。支持非@Observed和@ObserveV2修饰的class,JSON.parse返回的Object和@Sendable修饰的class。</br>支持Array、Map、Set和Date。</br>支持collection.Array, collection.Set和collection.Map。</br>具体使用规则,详见[makeObserved接口:将非观察数据变为可观察数据](../../ui/state-management/arkts-new-makeObserved.md)。 | 378 379**返回值:** 380 381| 类型 | 说明 | 382| ---- | ------------------------------------------------ | 383| T | 可观察的数据。 | 384 385**示例:** 386 387```ts 388import { UIUtils } from '@kit.ArkUI'; 389class NonObservedClass { 390 name: string = 'Tom'; 391} 392 393@Entry 394@ComponentV2 395struct Index { 396 observedClass: NonObservedClass = UIUtils.makeObserved(new NonObservedClass()); 397 nonObservedClass: NonObservedClass = new NonObservedClass(); 398 build() { 399 Column() { 400 Text(`observedClass: ${this.observedClass.name}`) 401 .onClick(() => { 402 this.observedClass.name = 'Jane'; // 刷新 403 }) 404 Text(`observedClass: ${this.nonObservedClass.name}`) 405 .onClick(() => { 406 this.nonObservedClass.name = 'Jane'; // 不刷新 407 }) 408 } 409 } 410} 411``` 412 413## StorageDefaultCreator\<T\> 414 415type StorageDefaultCreator\<T\> = () => T 416 417返回默认构造器的函数。 418 419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 420 421**系统能力:** SystemCapability.ArkUI.ArkUI.Full 422 423**返回值:** 424 425| 类型 | 说明 | 426| ---- | ------------------------------------------------ | 427| () => T | 返回默认构造器的函数。 | 428 429**示例:** 430 431```ts 432import { PersistenceV2 } from '@kit.ArkUI'; 433 434@ObservedV2 435class SampleClass { 436 @Trace id: number = 0; 437 count: number = 1; 438} 439 440@ObservedV2 441class FatherSampleClass { 442 @Trace sampleClass: SampleClass = new SampleClass(); 443} 444 445// 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给source 446// StorageDefaultCreator 指的是 () => new FatherSampleClass() 447const source: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass()); 448 449@Entry 450@Component 451struct SampleComp { 452 data: FatherSampleClass | undefined = source; 453 454 build() { 455 Column() { 456 Text(`${this.data?.sampleClass.id}`) 457 } 458 } 459} 460``` 461 462## TypeConstructorWithArgs\<T\> 463 464含有任意入参的类构造器。 465 466**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 467 468**系统能力:** SystemCapability.ArkUI.ArkUI.Full 469 470### new 471 472new(...args: any): T 473 474**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 475 476**系统能力:** SystemCapability.ArkUI.ArkUI.Full 477 478**参数:** 479 480| 参数名 | 类型 | 必填 | 说明 | 481| ------ | ---- | ---- | ------------ | 482| ...args | any | 是 | 函数入参。 | 483 484**返回值:** 485 486| 类型 | 说明 | 487| ---- | ------------------------------------------------ | 488| T | T类型的实例。 | 489 490**示例:** 491 492```ts 493import { PersistenceV2 } from '@kit.ArkUI'; 494 495@ObservedV2 496 // TypeConstructorWithArgs 指的是 SampleClass 497class SampleClass { 498 @Trace id: number = 0; 499 count: number = 1; 500} 501 502@ObservedV2 503class FatherSampleClass { 504 @Trace sampleClass: SampleClass = new SampleClass(); 505} 506 507// 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给source 508const source: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass()); 509 510@Entry 511@Component 512struct SampleComp { 513 data: FatherSampleClass | undefined = source; 514 515 build() { 516 Column() { 517 Text(`${this.data?.sampleClass.id}`) 518 } 519 } 520} 521``` 522 523## PersistenceErrorCallback 524 525type PersistenceErrorCallback = (key: string, reason: 'quota' | 'serialization' | 'unknown', message: string) => void 526 527持久化失败时返回错误原因的回调。 528 529**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 530 531**系统能力:** SystemCapability.ArkUI.ArkUI.Full 532 533**参数:** 534 535| 参数名 | 类型 | 必填 | 说明 | 536| ------ | ---- | ---- | ------------ | 537| key | string | 是 | 出错的键值。 | 538|reason| 'quota' \| 'serialization' \| 'unknown' | 是 | 出错的原因类型。 | 539| message | string | 是 | 出错的更多消息。 | 540 541**示例:** 542 543```ts 544import { PersistenceV2, Type } from '@kit.ArkUI'; 545 546@ObservedV2 547class SampleChild { 548 @Trace id: number = 0; 549 count: number = 10; 550} 551 552@ObservedV2 553export class Sample { 554 // 对于复杂对象需要@Type修饰,确保序列化成功 555 @Type(SampleChild) 556 @Trace sampleChild: SampleChild = new SampleChild(); 557} 558 559// 接受序列化失败的回调 560// PersistenceErrorCallback 指的是 (key: string, reason: string, msg: string) => {console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);} 561PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => { 562 console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`); 563}); 564 565@Entry 566@ComponentV2 567struct Index { 568 // 在PersistenceV2中创建一个key为Sample的键值对(如果存在,则返回PersistenceV2中的数据),并且和data关联 569 // 对于需要换connect对象的data属性,需要加@Local修饰(不建议对属性换connect的对象) 570 @Local data: Sample = PersistenceV2.connect(Sample, () => new Sample())!; 571 pageStack: NavPathStack = new NavPathStack(); 572 573 build() { 574 Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`) 575 .fontSize(30) 576 .onClick(() => { 577 this.data.sampleChild.id++; 578 }) 579 } 580} 581``` 582 583## TypeConstructor\<T\> 584 585类构造函数。 586 587**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 588 589**系统能力:** SystemCapability.ArkUI.ArkUI.Full 590 591### new 592 593new(): T 594 595**返回值:** 596 597| 类型 | 说明 | 598| ---- | ------------------------------------------------ | 599| T | T类型的实例。 | 600 601**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 602 603**系统能力:** SystemCapability.ArkUI.ArkUI.Full 604 605**示例:** 606 607```ts 608import { PersistenceV2, Type } from '@kit.ArkUI'; 609 610@ObservedV2 611class SampleChild { 612 @Trace id: number = 0; 613 count: number = 10; 614} 615 616@ObservedV2 617export class Sample { 618 // 对于复杂对象需要@Type修饰,确保序列化成功 619 // TypeConstructor 指的是 SampleChild 620 @Type(SampleChild) 621 @Trace sampleChild: SampleChild = new SampleChild(); 622} 623 624@Entry 625@ComponentV2 626struct Index { 627 data: Sample = PersistenceV2.connect(Sample, () => new Sample())!; 628 629 build() { 630 Column() { 631 Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`) 632 .fontSize(30) 633 .onClick(() => { 634 this.data.sampleChild.id++; 635 }) 636 } 637 } 638} 639``` 640 641## TypeDecorator 642 643type TypeDecorator = \<T\>(type: TypeConstructor\<T\>) => PropertyDecorator 644 645属性装饰器。 646 647**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 648 649**系统能力:** SystemCapability.ArkUI.ArkUI.Full 650 651**参数:** 652 653| 参数名 | 类型 | 必填 | 说明 | 654| ------ | ---- | ---- | ------------ | 655| type | [TypeConstructor\<T\>](#typeconstructort) | 是 | 标记类属性的类型。 | 656 657**返回值:** 658 659| 类型 | 说明 | 660| ---- | ------------------------------------------------ | 661| PropertyDecorator | 属性装饰器。 | 662 663**示例:** 664 665```ts 666import { PersistenceV2, Type } from '@kit.ArkUI'; 667 668@ObservedV2 669class SampleChild { 670 @Trace id: number = 0; 671 count: number = 10; 672} 673 674@ObservedV2 675export class Sample { 676 // 对于复杂对象需要@Type修饰,确保序列化成功 677 // TypeDecorator 指的是 @Type 678 @Type(SampleChild) 679 @Trace sampleChild: SampleChild = new SampleChild(); 680} 681 682@Entry 683@ComponentV2 684struct Index { 685 data: Sample = PersistenceV2.connect(Sample, () => new Sample())!; 686 687 build() { 688 Column() { 689 Text(`Index add 1 to data.id: ${this.data.sampleChild.id}`) 690 .fontSize(30) 691 .onClick(() => { 692 this.data.sampleChild.id++; 693 }) 694 } 695 } 696} 697``` 698