鸿蒙NEXT开发【@ohos.arkui.StateManagement (状态管理)】 UI界面API ...

打印 上一主题 下一主题

主题 1029|帖子 1029|积分 3087

状态管理模块提供了应用程序的数据存储本领、持久化数据管理本领、UIAbility数据存储本领和应用程序需要的环境状态、工具。
说明
本模块首批接口从API version 12开始支持。
本文中T和S的寄义如下:
类型描述TClass,number,boolean,string和这些类型的数组形式。Snumber,boolean,string。 导入模块

  1. import { AppStorageV2,PersistenceV2,UIUtils} from '@kit.ArkUI';
复制代码
connect12+

static connect(
type: TypeConstructorWithArgs,
keyOrDefaultCreator?: string | StorageDefaultCreator,
defaultCreator?: StorageDefaultCreator
): T | undefined;
将键值对数据储存在应用内存中。如果给定的key已经存在于[AppStorageV2]中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述typeTypeConstructorWithArgs是指定的类型,若未指定key,则使用type的name作为key。keyOrDefaultCreaterstringStorageDefaultCreator否defaultCreatorStorageDefaultCreator否获取默认值的构造器。 说明
1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器;
2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
3、同一个key,connect差别类型的数据会导致应用异常,应用需要确保类型匹配;
4、key建议使用有意义的值,长度不超过255,使用非法字符或空字符的行为是未定义的。
返回值:
类型描述T创建或获取AppStorageV2数据乐成时,返回数据;否则返回undefined。 示例:
  1. import { AppStorageV2 } from '@kit.ArkUI';
  2. @ObservedV2
  3. class SampleClass {
  4.   @Trace p: number = 0;
  5. }
  6. // 将key为SampleClass、value为new SampleClass()对象的键值对存储到内存中,并赋值给as1
  7. const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass());
  8. // 将key为key_as2、value为new SampleClass()对象的键值对存储到内存中,并赋值给as2
  9. const as2: SampleClass = AppStorageV2.connect(SampleClass, 'key_as2', () => new SampleClass())!;
  10. // key为SampleClass已经在AppStorageV2中,将key为SampleClass的值返回给as3
  11. const as3: SampleClass = AppStorageV2.connect(SampleClass) as SampleClass;
复制代码
remove12+

static remove(keyOrType: string | TypeConstructorWithArgs): void;
将指定的键值对数据从[AppStorageV2]里面删除。如果指定的键值不存在于AppStorageV2中,将删除失败。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述keyOrTypestringTypeConstructorWithArgs是 说明
删除AppStorageV2中不存在的key会报警告。
示例:
  1. // 假设AppStorageV2中存在key为key_as2的键,从AppStorageV2中删除该键值对数据
  2. AppStorageV2.remove('key_as2');
  3. // 假设AppStorageV2中存在key为SampleClass的键,从AppStorageV2中删除该键值对数据
  4. AppStorageV2.remove(SampleClass);
  5. // 假设AppStorageV2中不存在key为key_as1的键,报警告
  6. AppStorageV2.remove('key_as1');
复制代码
keys12+

static keys(): Array;
获取[AppStorageV2]中的全部key。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
无。
返回值:
类型描述Array全部AppStorageV2中的key。 说明
key在Array中的顺序是无序的,与key插入到AppStorageV2中的顺序无关。
示例:
  1. // 假设AppStorageV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys
  2. const keys: Array<string> = AppStorageV2.keys();
复制代码
connect12+

static connect(
type: TypeConstructorWithArgs,
keyOrDefaultCreator?: string | StorageDefaultCreator,
defaultCreator?: StorageDefaultCreator
): T | undefined;
将键值对数据储存在应用磁盘中(持久化)。如果给定的key已经存在于[PersistenceV2]中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。如果connect的是[@ObservedV2]对象,该对象的[@Trace]属性的变革,会触发整个关联对象的主动持久化;非@Trace属性的变革则不会,如有须要,可调用PersistenceV2.save接口手动持久化。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述typeTypeConstructorWithArgs是指定的类型,若未指定key,则使用type的name作为key。keyOrDefaultCreaterstringStorageDefaultCreator否defaultCreatorStorageDefaultCreator否获取默认值的构造器。 说明
1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器);
2、确保数据已经存储在PersistenceV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
3、同一个key,connect差别类型的数据会导致应用异常,应用需要确保类型匹配;
4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的。
返回值:
类型描述T创建或获取AppStorageV2数据乐成时,返回数据;否则返回undefined。 示例:
  1. import { PersistenceV2, Type } from '@kit.ArkUI';
  2. @ObservedV2
  3. class SampleClass {
  4.   @Trace p1: number = 0;
  5.   p2: number = 1;
  6. }
  7. @ObservedV2
  8. class FatherSampleClass {
  9.   @Trace f: SampleClass = new SampleClass();
  10. }
  11. // 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给as1
  12. const as1: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass());
  13. // 将key为key_as2、value为new SampleClass()对象的键值对持久化,并赋值给as2
  14. const as2: FatherSampleClass = PersistenceV2.connect(FatherSampleClass, 'key_as2', () => new FatherSampleClass())!;
  15. // key为SampleClass已经在PersistenceV2中,将key为SampleClass的值返回给as3
  16. const as3: FatherSampleClass = PersistenceV2.connect(FatherSampleClass) as FatherSampleClass;
  17. @Entry
  18. @Component
  19. struct SampleComp {
  20.   v: FatherSampleClass = as2;
  21.   build() {
  22.     Column() {
  23.       Text(`${this.v.f.p1}`)
  24.         .onClick(() => {
  25.           // 自动持久化
  26.           this.v.f.p1++;
  27.         })
  28.       Text(`${this.v.f.p2}`)
  29.         .onClick(() => {
  30.           // 不能自动持久化,需要调用PersistenceV2.save
  31.           this.v.f.p2++;
  32.         })
  33.     }
  34.   }
  35. }
复制代码
remove12+

static remove(keyOrType: string | TypeConstructorWithArgs): void;
将指定的键值对数据从[PersistenceV2]里面删除。如果指定的键值不存在于PersistenceV2中,将删除失败。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述keyOrTypestringTypeConstructorWithArgs是 说明
删除PersistenceV2中不存在的key会报警告。
示例:
  1. // 假设PersistenceV2中存在key为key_as2的键,从PersistenceV2中删除该键值对数据
  2. PersistenceV2.remove('key_as2');
  3. // 假设PersistenceV2中存在key为SampleClass的键,从PersistenceV2中删除该键值对数据
  4. PersistenceV2.remove(SampleClass);
  5. // 假设PersistenceV2中不存在key为key_as1的键,报警告
  6. PersistenceV2.remove('key_as1');
复制代码
keys12+

static keys(): Array;
获取[PersistenceV2]中的全部key。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
无。
返回值:
类型描述Array全部PersistenceV2中的key。 说明
key在Array中的顺序是无序的,与key插入到PersistenceV2中的顺序无关。
示例:
  1. // 假设PersistenceV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys
  2. const keys: Array<string> = PersistenceV2.keys();
复制代码
save12+

static save(keyOrType: string | TypeConstructorWithArgs): void;
将指定的键值对数据持久化一次。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述keyOrTypestringTypeConstructorWithArgs是 说明
由于非[@Trace]的数据改变不会触发[PersistenceV2]的主动持久化,如有须要,可调用该接口持久化对应key的数据;
手动持久化当前内存中不处于connect状态的key是偶然义的。
示例:
  1. // 假设PersistenceV2中存在key为key_as2的键,持久化该键值对数据
  2. PersistenceV2.save('key_as2');
  3. // 假设PersistenceV2中存在key为SampleClass的键,持久化该键值对数据
  4. PersistenceV2.remove(SampleClass);
  5. // 假设PersistenceV2中不存在key为key_as1的键,无意义的操作
  6. PersistenceV2.remove('key_as1');
复制代码
UIUtils

UIUtils提供一些方法,用于处理状态管理相关的数据转换。
getTarget12+

static getTarget(source: T): T;
从状态管理框架包裹的署理对象中获取原始对象。详见[getTarget接口:获取状态管理框架署理前的原始对象]。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述sourceT是数据源对象。 返回值:
类型描述T数据源对象去除状态管理框架所加署理后的原始对象。 示例:
  1. import { UIUtils } from '@kit.ArkUI';
  2. class NonObservedClass {
  3.   name: string = "Tom";
  4. }
  5. let nonObservedClass: NonObservedClass = new NonObservedClass();
  6. @Entry
  7. @Component
  8. struct Index {
  9.   @State someClass: NonObservedClass = nonObservedClass;
  10.   build() {
  11.     Column() {
  12.       Text(`this.someClass === nonObservedClass: ${this.someClass === nonObservedClass}`) // false
  13.       Text(`UIUtils.getTarget(this.someClass) === nonObservedClass: ${UIUtils.getTarget(this.someClass) ===
  14.         nonObservedClass}`) // true
  15.     }
  16.   }
  17. }
复制代码
makeObserved12+

static makeObserved(source: T): T;
将普通不可观察数据变为可观察数据。
元服务API:  从API version 12开始,该接口支持在元服务中使用。
系统本领:  SystemCapability.ArkUI.ArkUI.Full
参数:
参数名类型必填参数描述sourceT是数据源对象。支持非@Observed和@ObserveV2修饰的class,JSON.parse返回的Object和@Sendable修饰的class。支持Array、Map、Set和Date。支持collection.Array, collection.Set和collection.Map。 返回值:
类型描述T可观察的数据。 示例:
  1. import { UIUtils } from '@kit.ArkUI';
  2. class NonObservedClass {
  3.   name: string = 'Tom';
  4. }
  5. @Entry
  6. @ComponentV2
  7. struct Index {
  8.   observedClass: NonObservedClass = UIUtils.makeObserved(new NonObservedClass());
  9.   nonObservedClass: NonObservedClass = new NonObservedClass();
  10.   build() {
  11.     Column() {
  12.       Text(`observedClass: ${this.observedClass.name}`)
  13.         .onClick(() => {
  14.           this.observedClass.name = 'Jane'; // 刷新
  15.         })
  16.       Text(`observedClass: ${this.nonObservedClass.name}`)
  17.         .onClick(() => {
  18.           this.nonObservedClass.name = 'Jane'; // 不刷新
  19.         })
  20.     }
  21.   }
  22. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表