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状态存储)](../../quick-start/arkts-new-appstoragev2.md)
28
29### connect<sup>12+</sup>
30
31static&nbsp;connect\<T extends object\>( </br >
32  &nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;TypeConstructorWithArgs\<T\>, </br >
33  &nbsp;&nbsp;&nbsp;&nbsp;keyOrDefaultCreator?:&nbsp;string&nbsp;|&nbsp;StorageDefaultCreator\<T\>, </br >
34  &nbsp;&nbsp;&nbsp;&nbsp;defaultCreator?:&nbsp;StorageDefaultCreator\<T\> </br >
35):&nbsp;T&nbsp;|&nbsp;undefined;
36
37将键值对数据储存在应用内存中。如果给定的key已经存在于[AppStorageV2](../../quick-start/arkts-new-appstoragev2.md)中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。
38
39**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
40
41**系统能力:** SystemCapability.ArkUI.ArkUI.Full
42
43**参数:**
44
45| 参数名   | 类型   | 必填 | 参数描述               |
46| -------- | ------ | ---- | ---------------------- |
47| type | TypeConstructorWithArgs\<T\> | 是   | 指定的类型,若未指定key,则使用type的name作为key。 |
48| keyOrDefaultCreater | string&nbsp;\|&nbsp;StorageDefaultCreator\<T\> | 否   | 指定的key,或者是获取默认值的构造器。 |
49| defaultCreator | StorageDefaultCreator\<T\> | 否   | 获取默认值的构造器。 |
50
51>**说明:**
52>
53>1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器;
54>
55>2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
56>
57>3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配;
58>
59>4、key建议使用有意义的值,长度不超过255,使用非法字符或空字符的行为是未定义的。
60
61**返回值:**
62
63| 类型                                   | 描述                                                         |
64| -------------------------------------- | ------------------------------------------------------------ |
65| T | 创建或获取AppStorageV2数据成功时,返回数据;否则返回undefined。 |
66
67**示例:**
68
69```ts
70import { AppStorageV2 } from '@kit.ArkUI';
71
72@ObservedV2
73class SampleClass {
74  @Trace p: number = 0;
75}
76
77// 将key为SampleClass、value为new SampleClass()对象的键值对存储到内存中,并赋值给as1
78const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass());
79
80// 将key为key_as2、value为new SampleClass()对象的键值对存储到内存中,并赋值给as2
81const as2: SampleClass = AppStorageV2.connect(SampleClass, 'key_as2', () => new SampleClass())!;
82
83// key为SampleClass已经在AppStorageV2中,将key为SampleClass的值返回给as3
84const as3: SampleClass = AppStorageV2.connect(SampleClass) as SampleClass;
85```
86
87### remove<sup>12+</sup>
88
89static&nbsp;remove\<T\>(keyOrType:&nbsp;string&nbsp;|&nbsp;TypeConstructorWithArgs\<T\>):&nbsp;void;
90
91将指定的键值对数据从[AppStorageV2](../../quick-start/arkts-new-appstoragev2.md)里面删除。如果指定的键值不存在于AppStorageV2中,将删除失败。
92
93**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
94
95**系统能力:** SystemCapability.ArkUI.ArkUI.Full
96
97**参数:**
98
99| 参数名   | 类型   | 必填 | 参数描述               |
100| -------- | ------ | ---- | ---------------------- |
101| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是   | 需要删除的key;如果指定的是type类型,删除的key为type的name。 |
102
103>**说明:**
104>
105>删除AppStorageV2中不存在的key会报警告。
106
107
108**示例:**
109
110```ts
111// 假设AppStorageV2中存在key为key_as2的键,从AppStorageV2中删除该键值对数据
112AppStorageV2.remove('key_as2');
113
114// 假设AppStorageV2中存在key为SampleClass的键,从AppStorageV2中删除该键值对数据
115AppStorageV2.remove(SampleClass);
116
117// 假设AppStorageV2中不存在key为key_as1的键,报警告
118AppStorageV2.remove('key_as1');
119```
120
121### keys<sup>12+</sup>
122
123static&nbsp;keys():&nbsp;Array\<string\>;
124
125获取[AppStorageV2](../../quick-start/arkts-new-appstoragev2.md)中的所有key。
126
127**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
128
129**系统能力:** SystemCapability.ArkUI.ArkUI.Full
130
131**参数:**
132
133无。
134
135**返回值:**
136
137| 类型                                   | 描述                                                         |
138| -------------------------------------- | ------------------------------------------------------------ |
139| Array\<string\> | 所有AppStorageV2中的key。 |
140
141>**说明:**
142>
143>key在Array中的顺序是无序的,与key插入到AppStorageV2中的顺序无关。
144
145**示例:**
146
147```ts
148// 假设AppStorageV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys
149const keys: Array<string> = AppStorageV2.keys();
150```
151
152
153
154## PersistenceV2
155
156PersistenceV2具体UI使用说明,详见[PersistenceV2(持久化存储UI状态)](../../quick-start/arkts-new-persistencev2.md)
157
158### connect<sup>12+</sup>
159
160static&nbsp;connect\<T extends object\>( </br >
161  &nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;TypeConstructorWithArgs\<T\>, </br >
162  &nbsp;&nbsp;&nbsp;&nbsp;keyOrDefaultCreator?:&nbsp;string&nbsp;|&nbsp;StorageDefaultCreator\<T\>, </br >
163  &nbsp;&nbsp;&nbsp;&nbsp;defaultCreator?:&nbsp;StorageDefaultCreator\<T\> </br >
164):&nbsp;T&nbsp;|&nbsp;undefined;
165
166将键值对数据储存在应用磁盘中(持久化)。如果给定的key已经存在于[PersistenceV2](../../quick-start/arkts-new-persistencev2.md)中,返回对应的值;否则,通过获取默认值的构造器构造默认值,并返回。如果connect的是[\@ObservedV2](../../quick-start/arkts-new-observedV2-and-trace.md)对象,该对象的[\@Trace](../../quick-start/arkts-new-observedV2-and-trace.md)属性的变化,会触发**整个关联对象的自动持久化**;非\@Trace属性的变化则不会,如有必要,可调用PersistenceV2.save接口手动持久化。
167
168**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
169
170**系统能力:** SystemCapability.ArkUI.ArkUI.Full
171
172**参数:**
173
174| 参数名   | 类型   | 必填 | 参数描述               |
175| -------- | ------ | ---- | ---------------------- |
176| type | TypeConstructorWithArgs\<T\> | 是   | 指定的类型,若未指定key,则使用type的name作为key。 |
177| keyOrDefaultCreater | string&nbsp;\|&nbsp;StorageDefaultCreator\<T\> | 否   | 指定的key,或者是获取默认值的构造器。 |
178| defaultCreator | StorageDefaultCreator\<T\> | 否   | 获取默认值的构造器。 |
179
180>**说明:**
181>
182>1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器);
183>
184>2、确保数据已经存储在PersistenceV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
185>
186>3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配;
187>
188>4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的。
189
190**返回值:**
191
192| 类型                                   | 描述                                                         |
193| -------------------------------------- | ------------------------------------------------------------ |
194| T | 创建或获取AppStorageV2数据成功时,返回数据;否则返回undefined。 |
195
196**示例:**
197
198```ts
199import { PersistenceV2, Type } from '@kit.ArkUI';
200
201@ObservedV2
202class SampleClass {
203  @Trace p1: number = 0;
204  p2: number = 1;
205}
206
207@ObservedV2
208class FatherSampleClass {
209  @Trace f: SampleClass = new SampleClass();
210}
211
212// 将key为SampleClass、value为new SampleClass()对象的键值对持久化,并赋值给as1
213const as1: FatherSampleClass | undefined = PersistenceV2.connect(FatherSampleClass, () => new FatherSampleClass());
214
215// 将key为key_as2、value为new SampleClass()对象的键值对持久化,并赋值给as2
216const as2: FatherSampleClass = PersistenceV2.connect(FatherSampleClass, 'key_as2', () => new FatherSampleClass())!;
217
218// key为SampleClass已经在PersistenceV2中,将key为SampleClass的值返回给as3
219const as3: FatherSampleClass = PersistenceV2.connect(FatherSampleClass) as FatherSampleClass;
220
221@Entry
222@Component
223struct SampleComp {
224  v: FatherSampleClass = as2;
225
226  build() {
227    Column() {
228      Text(`${this.v.f.p1}`)
229        .onClick(() => {
230          // 自动持久化
231          this.v.f.p1++;
232        })
233      Text(`${this.v.f.p2}`)
234        .onClick(() => {
235          // 不能自动持久化,需要调用PersistenceV2.save
236          this.v.f.p2++;
237        })
238    }
239  }
240}
241```
242
243### remove<sup>12+</sup>
244
245static&nbsp;remove\<T\>(keyOrType:&nbsp;string&nbsp;|&nbsp;TypeConstructorWithArgs\<T\>):&nbsp;void;
246
247将指定的键值对数据从[PersistenceV2](../../quick-start/arkts-new-persistencev2.md)里面删除。如果指定的键值不存在于PersistenceV2中,将删除失败。
248
249**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
250
251**系统能力:** SystemCapability.ArkUI.ArkUI.Full
252
253**参数:**
254
255| 参数名   | 类型   | 必填 | 参数描述               |
256| -------- | ------ | ---- | ---------------------- |
257| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是   | 需要删除的key;如果指定的是type类型,删除的key为type的name。 |
258
259>**说明:**
260>
261>删除PersistenceV2中不存在的key会报警告。
262
263
264**示例:**
265
266```ts
267// 假设PersistenceV2中存在key为key_as2的键,从PersistenceV2中删除该键值对数据
268PersistenceV2.remove('key_as2');
269
270// 假设PersistenceV2中存在key为SampleClass的键,从PersistenceV2中删除该键值对数据
271PersistenceV2.remove(SampleClass);
272
273// 假设PersistenceV2中不存在key为key_as1的键,报警告
274PersistenceV2.remove('key_as1');
275```
276
277### keys<sup>12+</sup>
278
279static&nbsp;keys():&nbsp;Array\<string\>;
280
281获取[PersistenceV2](../../quick-start/arkts-new-persistencev2.md)中的所有key。
282
283**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
284
285**系统能力:** SystemCapability.ArkUI.ArkUI.Full
286
287**参数:**
288
289无。
290
291**返回值:**
292
293| 类型                                   | 描述                                                         |
294| -------------------------------------- | ------------------------------------------------------------ |
295| Array\<string\> | 所有PersistenceV2中的key。 |
296
297>**说明:**
298>
299>key在Array中的顺序是无序的,与key插入到PersistenceV2中的顺序无关。
300
301**示例:**
302
303```ts
304// 假设PersistenceV2中存在两个key(key_as1、key_as2),返回[key_as1、key_as2]赋值给keys
305const keys: Array<string> = PersistenceV2.keys();
306```
307
308### save<sup>12+</sup>
309
310static&nbsp;save\<T\>(keyOrType:&nbsp;string&nbsp;|&nbsp;TypeConstructorWithArgs\<T\>):&nbsp;void;
311
312将指定的键值对数据持久化一次。
313
314**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
315
316**系统能力:** SystemCapability.ArkUI.ArkUI.Full
317
318**参数:**
319
320| 参数名   | 类型   | 必填 | 参数描述               |
321| -------- | ------ | ---- | ---------------------- |
322| keyOrType | string \| TypeConstructorWithArgs\<T\> | 是   | 需要持久化的key;如果指定的是type类型,持久化的key为type的name。 |
323
324>**说明:**
325>
326>由于非[\@Trace](../../quick-start/arkts-new-observedV2-and-trace.md)的数据改变不会触发[PersistenceV2](../../quick-start/arkts-new-persistencev2.md)的自动持久化,如有必要,可调用该接口持久化对应key的数据;
327>
328>手动持久化当前内存中不处于connect状态的key是无意义的。
329
330
331**示例:**
332
333```ts
334// 假设PersistenceV2中存在key为key_as2的键,持久化该键值对数据
335PersistenceV2.save('key_as2');
336
337// 假设PersistenceV2中存在key为SampleClass的键,持久化该键值对数据
338PersistenceV2.remove(SampleClass);
339
340// 假设PersistenceV2中不存在key为key_as1的键,无意义的操作
341PersistenceV2.remove('key_as1');
342```
343
344## UIUtils
345
346UIUtils提供一些方法,用于处理状态管理相关的数据转换。
347
348### getTarget<sup>12+</sup>
349
350static getTarget\<T extends object\>(source: T): T;
351
352从状态管理框架包裹的代理对象中获取原始对象。详见[getTarget接口:获取状态管理框架代理前的原始对象](../../quick-start/arkts-new-getTarget.md)。
353
354**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
355
356**系统能力:** SystemCapability.ArkUI.ArkUI.Full
357
358**参数:**
359
360| 参数名 | 类型 | 必填 | 参数描述     |
361| ------ | ---- | ---- | ------------ |
362| source | T    | 是   | 数据源对象。 |
363
364**返回值:**
365
366| 类型 | 描述                                             |
367| ---- | ------------------------------------------------ |
368| T    | 数据源对象去除状态管理框架所加代理后的原始对象。 |
369
370**示例:**
371
372```ts
373import { UIUtils } from '@kit.ArkUI';
374class NonObservedClass {
375  name: string = "Tom";
376}
377let nonObservedClass: NonObservedClass = new NonObservedClass();
378@Entry
379@Component
380struct Index {
381  @State someClass: NonObservedClass = nonObservedClass;
382  build() {
383    Column() {
384      Text(`this.someClass === nonObservedClass: ${this.someClass === nonObservedClass}`) // false
385      Text(`UIUtils.getTarget(this.someClass) === nonObservedClass: ${UIUtils.getTarget(this.someClass) ===
386        nonObservedClass}`) // true
387    }
388  }
389}
390```
391### makeObserved<sup>12+</sup>
392
393static makeObserved\<T extends object\>(source: T): T;
394
395将普通不可观察数据变为可观察数据。详见[makeObserved接口:将非观察数据变为可观察数据](../../quick-start/arkts-new-makeObserved.md)。
396
397**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
398
399**系统能力:** SystemCapability.ArkUI.ArkUI.Full
400
401**参数:**
402
403| 参数名 | 类型 | 必填 | 参数描述     |
404| ------ | ---- | ---- | ------------ |
405| source | T    | 是   | 数据源对象。支持非@Observed和@ObserveV2修饰的class,JSON.parse返回的Object和@Sendable修饰的class。</br>支持Array、Map、Set和Date。</br>支持collection.Array, collection.Setcollection.Map。</br>具体使用规则,详见[makeObserved接口:将非观察数据变为可观察数据](../../quick-start/arkts-new-makeObserved.md)。 |
406
407**返回值:**
408
409| 类型 | 描述                                             |
410| ---- | ------------------------------------------------ |
411| T    | 可观察的数据。 |
412
413**示例:**
414
415```ts
416import { UIUtils } from '@kit.ArkUI';
417class NonObservedClass {
418  name: string = 'Tom';
419}
420
421@Entry
422@ComponentV2
423struct Index {
424  observedClass: NonObservedClass = UIUtils.makeObserved(new NonObservedClass());
425  nonObservedClass: NonObservedClass = new NonObservedClass();
426  build() {
427    Column() {
428      Text(`observedClass: ${this.observedClass.name}`)
429        .onClick(() => {
430          this.observedClass.name = 'Jane'; // 刷新
431        })
432      Text(`observedClass: ${this.nonObservedClass.name}`)
433        .onClick(() => {
434          this.nonObservedClass.name = 'Jane'; // 不刷新
435        })
436    }
437  }
438}
439```