@buaa_smat/hometrans 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +141 -124
- package/agents/build-fixer.md +1 -0
- package/agents/code-review-fix.md +1 -0
- package/agents/code-reviewer.md +1 -0
- package/agents/logic-coding.md +1 -0
- package/agents/logic-context-builder.md +1 -0
- package/agents/review-fixer.md +1 -0
- package/agents/self-test-fixer.md +1 -0
- package/agents/self-tester.md +260 -233
- package/agents/spec-generator.md +1 -0
- package/agents/test-tools/autotest/README.md +223 -0
- package/agents/test-tools/autotest/config.yaml.example +58 -0
- package/agents/test-tools/autotest/pyproject.toml +16 -0
- package/agents/test-tools/autotest/report_tool.py +759 -0
- package/agents/test-tools/autotest/self_test_runner.py +773 -0
- package/agents/test-tools/autotest/testcases_schema.md +143 -0
- package/agents/test-tools/autotest/testcases_tool.py +215 -0
- package/agents/test-tools/autotest/uv.lock +3156 -0
- package/agents/test-tools/harmony_autotest-0.1.0-py3-none-any.whl +0 -0
- package/agents/test-tools/hypium-6.1.0.210-py3-none-any.whl +0 -0
- package/agents/test-tools/hypium_mcp-0.6.5-py3-none-any.whl +0 -0
- package/agents/test-tools/xdevice-6.1.0.210-py3-none-any.whl +0 -0
- package/agents/test-tools/xdevice_devicetest-6.1.0.210-py3-none-any.whl +0 -0
- package/agents/test-tools/xdevice_ohos-6.1.0.210-py3-none-any.whl +0 -0
- package/dist/cli/config-store.js +27 -2
- package/dist/cli/config.js +17 -6
- package/dist/cli/index.js +3 -2
- package/dist/cli/init.js +135 -22
- package/dist/cli/mcp.js +2 -2
- package/dist/context/index.js +165 -69
- package/package.json +59 -60
- package/skills/code-dev-review-fix/SKILL.md +279 -0
- package/skills/code-dev-review-fix-workspace/evals/evals.json +56 -0
- package/skills/code-dev-review-fix-workspace/iteration-1/routing-results.md +23 -0
- package/skills/convert_pipeline/SKILL.md +423 -439
- package/skills/hmos-resources-convert/SKILL.md +623 -0
- package/skills/hmos-resources-convert/evals/evals.json +171 -0
- package/skills/hmos-resources-convert/references/conversion-rules.md +663 -0
- package/skills/hmos-resources-convert/references/dependency-analysis-rules.md +388 -0
- package/skills/hmos-resources-convert/references/resource-mapping-rules.md +457 -0
- package/skills/hmos-resources-convert/references/xml-drawable-to-svg-rules.md +513 -0
- package/skills/hmos-resources-convert/template/AppScope/app.json5 +10 -0
- package/skills/hmos-resources-convert/template/AppScope/resources/base/element/string.json +8 -0
- package/skills/hmos-resources-convert/template/AppScope/resources/base/media/background.png +0 -0
- package/skills/hmos-resources-convert/template/AppScope/resources/base/media/foreground.png +0 -0
- package/skills/hmos-resources-convert/template/AppScope/resources/base/media/layered_image.json +7 -0
- package/skills/hmos-resources-convert/template/build-profile.json5 +42 -0
- package/skills/hmos-resources-convert/template/code-linter.json5 +32 -0
- package/skills/hmos-resources-convert/template/entry/build-profile.json5 +33 -0
- package/skills/hmos-resources-convert/template/entry/hvigorfile.ts +6 -0
- package/skills/hmos-resources-convert/template/entry/obfuscation-rules.txt +23 -0
- package/skills/hmos-resources-convert/template/entry/oh-package.json5 +10 -0
- package/skills/hmos-resources-convert/template/entry/src/main/ets/entryability/EntryAbility.ets +48 -0
- package/skills/hmos-resources-convert/template/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +16 -0
- package/skills/hmos-resources-convert/template/entry/src/main/ets/pages/Index.ets +23 -0
- package/skills/hmos-resources-convert/template/entry/src/main/module.json5 +55 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/color.json +8 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/float.json +8 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/string.json +16 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/background.png +0 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/foreground.png +0 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/layered_image.json +7 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/media/startIcon.png +0 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/backup_config.json +3 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/main_pages.json +5 -0
- package/skills/hmos-resources-convert/template/entry/src/main/resources/dark/element/color.json +8 -0
- package/skills/hmos-resources-convert/template/entry/src/mock/mock-config.json5 +2 -0
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/Ability.test.ets +35 -0
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/List.test.ets +5 -0
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/module.json5 +16 -0
- package/skills/hmos-resources-convert/template/entry/src/test/List.test.ets +5 -0
- package/skills/hmos-resources-convert/template/entry/src/test/LocalUnit.test.ets +33 -0
- package/skills/hmos-resources-convert/template/hvigor/hvigor-config.json5 +23 -0
- package/skills/hmos-resources-convert/template/hvigorfile.ts +6 -0
- package/skills/hmos-resources-convert/template/oh-package-lock.json5 +28 -0
- package/skills/hmos-resources-convert/template/oh-package.json5 +10 -0
- package/skills/hmos-resources-convert/tools/apktool.bat +85 -0
- package/skills/hmos-resources-convert/tools/apktool_3.0.1.jar +0 -0
- package/skills/hmos-ui-align/SKILL.md +182 -0
- package/skills/hmos-ui-align/config-example.json +11 -0
- package/skills/hmos-ui-align/config.json +11 -0
- package/skills/hmos-ui-align/diff_analysis.md +53 -0
- package/skills/hmos-ui-align/page_align.md +62 -0
- package/skills/hmos-ui-align/readme.md +231 -0
- package/skills/hmos-ui-align/references/Comparison_Template.md +2 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2089 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +903 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217V1.md +911 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +355 -0
- package/skills/hmos-ui-align/references/MVVM/345/274/200/345/217/221/346/226/207/346/241/243//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -0
- package/skills/hmos-ui-align/references/UI_Analysis_Template.md +4 -0
- package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
- package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
- package/skills/hmos-ui-align/references/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
- package/skills/hmos-ui-align/scripts/app_feature_verify.py +443 -0
- package/skills/hmos-ui-align/scripts/navigation-capure.md +37 -0
- package/skills/hmos-ui-align/scripts/page_capture.py +592 -0
- package/skills/hmos-ui-align-batch/SKILL.md +99 -0
- package/skills/hmos-ui-align-batch/references/conversion-procedure.md +180 -0
- package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +2535 -0
- package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +555 -0
- package/skills/hmos-ui-align-batch/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +117 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Link/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/217/214/345/220/221/345/220/214/346/255/245.md +648 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Observed/350/243/205/351/245/260/345/231/250/345/222/214@ObjectLink/350/243/205/351/245/260/345/231/250/357/274/232/345/265/214/345/245/227/347/261/273/345/257/271/350/261/241/345/261/236/346/200/247/345/217/230/345/214/226.md +2089 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Prop/350/243/205/351/245/260/345/231/250/357/274/232/347/210/266/345/255/220/345/215/225/345/220/221/345/220/214/346/255/245.md +1033 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Provide/350/243/205/351/245/260/345/231/250/345/222/214@Consume/350/243/205/351/245/260/345/231/250/357/274/232/344/270/216/345/220/216/344/273/243/347/273/204/344/273/266/345/217/214/345/220/221/345/220/214/346/255/245.md +1183 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@State/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/347/212/266/346/200/201.md +576 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Track/350/243/205/351/245/260/345/231/250/357/274/232class/345/257/271/350/261/241/345/261/236/346/200/247/347/272/247/346/233/264/346/226/260.md +297 -0
- package/skills/hmos-ui-align-batch/references/mvvm/@Watch/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/346/233/264/346/224/271/351/200/232/347/237/245.md +395 -0
- package/skills/hmos-ui-align-batch/references/mvvm/AppStorage/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200/347/232/204UI/347/212/266/346/200/201/345/255/230/345/202/250.md +903 -0
- package/skills/hmos-ui-align-batch/references/mvvm/Environment/357/274/232/350/256/276/345/244/207/347/216/257/345/242/203/346/237/245/350/257/242.md +106 -0
- package/skills/hmos-ui-align-batch/references/mvvm/LocalStorage/357/274/232/351/241/265/351/235/242/347/272/247UI/347/212/266/346/200/201/345/255/230/345/202/250.md +1178 -0
- package/skills/hmos-ui-align-batch/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md +911 -0
- package/skills/hmos-ui-align-batch/references/mvvm/PersistentStorage/357/274/232/346/214/201/344/271/205/345/214/226/345/255/230/345/202/250UI/347/212/266/346/200/201.md +355 -0
- package/skills/hmos-ui-align-batch/references/mvvm//347/256/241/347/220/206/345/272/224/347/224/250/346/213/245/346/234/211/347/232/204/347/212/266/346/200/201/346/246/202/350/277/260.md +11 -0
- package/skills/hmos-ui-align-batch/scripts/android_parse_fast.py +1606 -0
- package/skills/self-test/SKILL.md +369 -0
- package/skills/self-test/readme.md +309 -0
- package/skills/spec-generator-skill/SKILL.md +332 -0
- package/skills/spec-generator-skill/references/android-platform-tokens.md +105 -0
- package/skills/spec-generator-skill/references/spec-sample-1.md +78 -0
- package/skills/spec-generator-skill/references/spec-sample-2.md +58 -0
- package/skills/spec-generator-skill/references/spec-sample-3.md +116 -0
- package/skills/spec-generator-skill/references/step4-report-template.md +33 -0
- package/agents/self-test-setup.md +0 -165
- package/dist/context/resources/sdkConfig.json +0 -24
- package/src/context/resources/sdkConfig.json +0 -24
|
@@ -0,0 +1,576 @@
|
|
|
1
|
+
# @State装饰器:组件内状态
|
|
2
|
+
|
|
3
|
+
被状态变量装饰器装饰的变量称为状态变量,使普通变量具备状态属性。当状态变量改变时,会触发其直接绑定的UI组件渲染更新。
|
|
4
|
+
|
|
5
|
+
在状态变量相关装饰器中,@State是最基础的装饰器,也是大部分状态变量的数据源。
|
|
6
|
+
|
|
7
|
+
在阅读@State文档前,建议开发者对状态管理框架有基本的了解。建议提前阅读:[状态管理概述](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overview)。最佳实践请参考[状态管理最佳实践](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-status-management)。常见问题请参考[状态管理常见问题](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-faq)。
|
|
8
|
+
|
|
9
|
+
> **说明:**
|
|
10
|
+
>
|
|
11
|
+
> 从API version 9开始,该装饰器支持在ArkTS卡片中使用。
|
|
12
|
+
>
|
|
13
|
+
> 从API version 11开始,该装饰器支持在元服务中使用。
|
|
14
|
+
|
|
15
|
+
## 概述
|
|
16
|
+
|
|
17
|
+
@State装饰的变量与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型并完成本地初始化;若需从父组件初始化,也可选择使用命名参数机制完成赋值。
|
|
18
|
+
|
|
19
|
+
@State装饰的变量拥有以下特性:
|
|
20
|
+
|
|
21
|
+
- @State装饰的变量生命周期与其所属自定义组件的生命周期相同。
|
|
22
|
+
|
|
23
|
+
## 装饰器使用规则说明
|
|
24
|
+
|
|
25
|
+
| @State变量装饰器 | 说明 |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| 装饰器参数 | 无 |
|
|
28
|
+
| 同步类型 | 不与父组件中任何类型的变量同步。 |
|
|
29
|
+
| 允许装饰的变量类型 | object、class、string、number、boolean、enum类型,以及这些类型的数组。API version 10开始支持[Date类型](#装饰date类型变量)。API version 11及以上支持[Map](#装饰map类型变量)、[Set](#装饰set类型变量)类型、undefined和null类型、ArkUI框架定义的联合类型[Length](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-types#length)、[ResourceStr](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-types#resourcestr)、[ResourceColor](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-types#resourcecolor)类型以及这些类型的联合类型,示例见[@State支持联合类型实例](#state支持联合类型实例)。支持类型的场景见[观察变化](#观察变化)。 |
|
|
30
|
+
| 不允许装饰的变量类型 | 不支持装饰Function类型。 |
|
|
31
|
+
| 被装饰变量的初始值 | 必须本地初始化。 |
|
|
32
|
+
|
|
33
|
+
## 变量的传递/访问规则说明
|
|
34
|
+
|
|
35
|
+
| 传递/访问 | 说明 |
|
|
36
|
+
| --- | --- |
|
|
37
|
+
| 从父组件初始化 | 可以从父组件或本地初始化。父组件传入非undefined值时覆盖本地初始值,否则使用@State的本地初始值。支持父组件中的常规变量以及装饰器装饰的状态变量:@State、[@Link](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-link)、[@Prop](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-prop)、[@Provide](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-provide-and-consume)、[@Consume](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-provide-and-consume)、[@ObjectLink](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-observed-and-objectlink)、[@StorageLink](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-appstorage#storagelink)、[@StorageProp](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-appstorage#storageprop)、[@LocalStorageLink](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-localstorage#localstoragelink)和[@LocalStorageProp](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-localstorage#localstorageprop),初始化@State。需要注意:父组件传入的外部变量对@State初始化时,仅作为初始值,后续变量的变化不会同步至@State。 |
|
|
38
|
+
| 用于初始化子组件 | @State装饰的变量支持初始化子组件的常规变量、@State、@Link、@Prop、@Provide。 |
|
|
39
|
+
| 是否支持组件外访问 | 不支持,只能在组件内访问。 |
|
|
40
|
+
|
|
41
|
+
**图1** 初始化规则图示
|
|
42
|
+
|
|
43
|
+

|
|
44
|
+
|
|
45
|
+
## 观察变化和行为表现
|
|
46
|
+
|
|
47
|
+
并不是状态变量的所有更改都会引起UI的刷新,只有可以被框架观察到的修改才会引起UI刷新。本小节将介绍什么样的修改才能被观察到,以及观察到变化后,框架是怎么引起UI刷新的,即框架的行为表现是什么。
|
|
48
|
+
|
|
49
|
+
### 观察变化
|
|
50
|
+
|
|
51
|
+
- 当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
// 简单类型
|
|
55
|
+
@State count: number = 0;
|
|
56
|
+
// 可以观察到值的变化
|
|
57
|
+
this.count = 1;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
- 当装饰的数据类型为class或Object时,可以观察到自身的赋值和属性赋值的变化,即Object.keys(observedObject)返回的所有属性。示例如下:
|
|
61
|
+
|
|
62
|
+
声明Person和Model类。
|
|
63
|
+
|
|
64
|
+
```TypeScript
|
|
65
|
+
class Person {
|
|
66
|
+
public value: string;
|
|
67
|
+
|
|
68
|
+
constructor(value: string) {
|
|
69
|
+
this.value = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
class Model {
|
|
74
|
+
public value: string;
|
|
75
|
+
public name: Person;
|
|
76
|
+
|
|
77
|
+
constructor(value: string, person: Person) {
|
|
78
|
+
this.value = value;
|
|
79
|
+
this.name = person;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
@State装饰的类型是Model。
|
|
85
|
+
|
|
86
|
+
```TypeScript
|
|
87
|
+
// class类型
|
|
88
|
+
@State title: Model = new Model('Hello', new Person('World'));
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
对@State装饰变量的赋值。
|
|
92
|
+
|
|
93
|
+
```TypeScript
|
|
94
|
+
// class类型赋值
|
|
95
|
+
this.title = new Model('Hi', new Person('ArkUI'));
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
对@State装饰变量的属性赋值。
|
|
99
|
+
|
|
100
|
+
```TypeScript
|
|
101
|
+
// class属性的赋值
|
|
102
|
+
this.title.value = 'Hi';
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
对嵌套对象的属性直接赋值无法被框架观察到,因此不会触发UI刷新。
|
|
106
|
+
|
|
107
|
+
```TypeScript
|
|
108
|
+
// 嵌套的属性赋值观察不到
|
|
109
|
+
this.title.name.value = 'ArkUI';
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- 当装饰的对象是Array时,可以观察到Array整体的赋值及数组元素的赋值,同时可以通过调用Array的接口push, pop, shift, unshift, splice, copyWithin, fill, reverse, sort更新Array中的数据。数组项中嵌套的属性赋值无法观察。详见[装饰Array类型变量](#装饰array类型变量)。
|
|
113
|
+
|
|
114
|
+
- 当装饰的对象是Date时,可以观察到Date的赋值,以及通过调用Date的接口setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds, setTime, setUTCFullYear, setUTCMonth, setUTCDate, setUTCHours, setUTCMinutes, setUTCSeconds, setUTCMilliseconds更新Date的属性,详见[装饰Date类型变量](#装饰date类型变量)。
|
|
115
|
+
|
|
116
|
+
- 当装饰的变量是Map时,可以观察到Map整体的赋值,以及通过调用Map的接口set, clear, delete更新Map的值。详见[装饰Map类型变量](#装饰map类型变量)。
|
|
117
|
+
|
|
118
|
+
- 当装饰的变量是Set时,可以观察到Set整体的赋值,以及通过调用Set的接口add, clear, delete更新Set的值。详见[装饰Set类型变量](#装饰set类型变量)。
|
|
119
|
+
|
|
120
|
+
### 框架行为
|
|
121
|
+
|
|
122
|
+
- 当状态变量改变时,查询依赖该状态变量的组件。
|
|
123
|
+
|
|
124
|
+
- 执行依赖该状态变量的组件更新方法,实现组件更新渲染。
|
|
125
|
+
|
|
126
|
+
## 限制条件
|
|
127
|
+
|
|
128
|
+
1. @State装饰的变量必须初始化,否则编译期会报错。
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
// 错误写法,编译报错
|
|
132
|
+
@State count: number;
|
|
133
|
+
|
|
134
|
+
// 正确写法
|
|
135
|
+
@State count: number = 10;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
2. @State不支持装饰Function类型的变量,框架会抛出运行时错误。
|
|
139
|
+
|
|
140
|
+
3. 父组件传入undefined时,@State装饰的变量仍使用本地默认值进行初始化。
|
|
141
|
+
|
|
142
|
+
```TypeScript
|
|
143
|
+
@Entry
|
|
144
|
+
@Component
|
|
145
|
+
struct Parent {
|
|
146
|
+
@State count: number | undefined = undefined;
|
|
147
|
+
|
|
148
|
+
build() {
|
|
149
|
+
Column() {
|
|
150
|
+
Text(`Parent count value: ${this.count}`)
|
|
151
|
+
.fontSize(20)
|
|
152
|
+
.margin(10)
|
|
153
|
+
Child({ count: this.count })
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
@Component
|
|
159
|
+
struct Child {
|
|
160
|
+
@State count: number | undefined = 0;
|
|
161
|
+
|
|
162
|
+
build() {
|
|
163
|
+
Column() {
|
|
164
|
+
Text(`Child count value: ${this.count}`)
|
|
165
|
+
.fontSize(20)
|
|
166
|
+
.margin(10)
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## 使用场景
|
|
173
|
+
|
|
174
|
+
### 装饰简单类型的变量
|
|
175
|
+
|
|
176
|
+
以下示例为@State装饰的简单类型,count被@State装饰成为状态变量,count的改变引起Button组件的刷新:
|
|
177
|
+
|
|
178
|
+
- 当状态变量count改变时,只能查询到Button组件与之关联。
|
|
179
|
+
|
|
180
|
+
- 执行Button组件的更新方法,实现按需刷新。
|
|
181
|
+
|
|
182
|
+
```TypeScript
|
|
183
|
+
@Entry
|
|
184
|
+
@Component
|
|
185
|
+
struct MyComponent {
|
|
186
|
+
@State count: number = 0; // 使用@State装饰简单类型变量
|
|
187
|
+
|
|
188
|
+
build() {
|
|
189
|
+
Row() {
|
|
190
|
+
Column() {
|
|
191
|
+
Button(`click times: ${this.count}`)
|
|
192
|
+
.onClick(() => {
|
|
193
|
+
this.count += 1;
|
|
194
|
+
})
|
|
195
|
+
.width(300)
|
|
196
|
+
}
|
|
197
|
+
.width('100%')
|
|
198
|
+
}
|
|
199
|
+
.height('100%')
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+

|
|
205
|
+
|
|
206
|
+
### 装饰class对象类型的变量
|
|
207
|
+
|
|
208
|
+
- 自定义组件MyComponent定义了被@State装饰的状态变量count和title,其中title的类型为自定义类Model。如果count或title的值发生变化,则查询MyComponent中使用该状态变量的UI组件,并进行重新渲染。
|
|
209
|
+
|
|
210
|
+
- EntryComponent中有多个MyComponent组件实例,第一个MyComponent内部状态的更改不会影响第二个MyComponent。
|
|
211
|
+
|
|
212
|
+
```TypeScript
|
|
213
|
+
class Model {
|
|
214
|
+
public value: string;
|
|
215
|
+
|
|
216
|
+
constructor(value: string) {
|
|
217
|
+
this.value = value;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
@Entry
|
|
222
|
+
@Component
|
|
223
|
+
struct EntryComponent {
|
|
224
|
+
build() {
|
|
225
|
+
Column() {
|
|
226
|
+
// 此处指定的参数都将在初始渲染时覆盖本地定义的默认值,并不是所有的参数都需要从父组件初始化
|
|
227
|
+
MyComponent({ count: 1, increaseBy: 2 })
|
|
228
|
+
.width(300)
|
|
229
|
+
MyComponent({ title: new Model('Hello World 2'), count: 7 })
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
@Component
|
|
235
|
+
struct MyComponent {
|
|
236
|
+
@State title: Model = new Model('Hello World');
|
|
237
|
+
@State count: number = 0;
|
|
238
|
+
increaseBy: number = 1;
|
|
239
|
+
|
|
240
|
+
build() {
|
|
241
|
+
Column() {
|
|
242
|
+
Text(`${this.title.value}`)
|
|
243
|
+
.margin(10)
|
|
244
|
+
Button(`Click to change title`)
|
|
245
|
+
.onClick(() => {
|
|
246
|
+
// @State变量的更新将触发上面的Text组件内容更新
|
|
247
|
+
this.title.value = this.title.value === 'Hello ArkUI' ? 'Hello World' : 'Hello ArkUI';
|
|
248
|
+
})
|
|
249
|
+
.width(300)
|
|
250
|
+
.margin(10)
|
|
251
|
+
|
|
252
|
+
Button(`Click to increase count = ${this.count}`)
|
|
253
|
+
.onClick(() => {
|
|
254
|
+
// @State变量的更新将触发该Button组件的内容更新
|
|
255
|
+
this.count += this.increaseBy;
|
|
256
|
+
})
|
|
257
|
+
.width(300)
|
|
258
|
+
.margin(10)
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+

|
|
265
|
+
|
|
266
|
+
从上述示例中,我们可以了解到@State变量的初始化机制:
|
|
267
|
+
|
|
268
|
+
1. 上述示例中,在没有外部传入的情况下,使用默认的值进行本地初始化:
|
|
269
|
+
|
|
270
|
+
```TypeScript
|
|
271
|
+
// title没有外部传入,使用本地的值new Model('Hello World')进行初始化
|
|
272
|
+
MyComponent({ count: 1, increaseBy: 2 })
|
|
273
|
+
// increaseBy没有外部传入,使用本地的值1进行初始化
|
|
274
|
+
MyComponent({ title: new Model('Hello World 2'), count: 7 })
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
2. 上述示例中,在有外部传入的情况下,使用外部传入的值进行初始化:
|
|
278
|
+
|
|
279
|
+
```TypeScript
|
|
280
|
+
// count和increaseBy均有外部传入,分别使用传入的1和2进行初始化
|
|
281
|
+
MyComponent({ count: 1, increaseBy: 2 })
|
|
282
|
+
// title和count均有外部传入,分别使用传入的new Model('Hello World 2')和7进行初始化
|
|
283
|
+
MyComponent({ title: new Model('Hello World 2'), count: 7 })
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 装饰Array类型变量
|
|
287
|
+
|
|
288
|
+
在下面的示例中,@State装饰的变量fruits的类型为Array<Fruit>,点击Button改变fruits的值,视图会随之刷新。
|
|
289
|
+
|
|
290
|
+
```TypeScript
|
|
291
|
+
class Fruit {
|
|
292
|
+
public name: string;
|
|
293
|
+
|
|
294
|
+
constructor(name: string) {
|
|
295
|
+
this.name = name;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
@Entry
|
|
300
|
+
@Component
|
|
301
|
+
struct ArraySample {
|
|
302
|
+
@State fruits: Fruit[] = [new Fruit('apple'), new Fruit('banana')]; // 使用@State装饰Array类型变量
|
|
303
|
+
|
|
304
|
+
build() {
|
|
305
|
+
Row() {
|
|
306
|
+
Column() {
|
|
307
|
+
ForEach(this.fruits, (item: Fruit) => {
|
|
308
|
+
Text(`${item.name}`)
|
|
309
|
+
.fontSize(20)
|
|
310
|
+
.margin(10)
|
|
311
|
+
})
|
|
312
|
+
// 对数组元素重新赋值,触发UI刷新
|
|
313
|
+
Button('Set element at index 0')
|
|
314
|
+
.onClick(() => {
|
|
315
|
+
this.fruits[0] = new Fruit('orange');
|
|
316
|
+
})
|
|
317
|
+
.width(300)
|
|
318
|
+
.margin(10)
|
|
319
|
+
// 新增数组元素,触发UI刷新
|
|
320
|
+
Button('Push element')
|
|
321
|
+
.onClick(() => {
|
|
322
|
+
this.fruits.push(new Fruit('cherry'));
|
|
323
|
+
})
|
|
324
|
+
.width(300)
|
|
325
|
+
.margin(10)
|
|
326
|
+
// 删除数组元素,触发UI刷新
|
|
327
|
+
Button('Pop element')
|
|
328
|
+
.onClick(() => {
|
|
329
|
+
this.fruits.pop();
|
|
330
|
+
})
|
|
331
|
+
.width(300)
|
|
332
|
+
.margin(10)
|
|
333
|
+
// 对数组整体重新赋值,触发UI刷新
|
|
334
|
+
Button('Reset array')
|
|
335
|
+
.onClick(() => {
|
|
336
|
+
this.fruits = [new Fruit('strawberry'), new Fruit('blueberry')];
|
|
337
|
+
})
|
|
338
|
+
.width(300)
|
|
339
|
+
.margin(10)
|
|
340
|
+
// 修改嵌套的属性,无法触发UI刷新
|
|
341
|
+
Button('Modify element[0] property')
|
|
342
|
+
.onClick(() => {
|
|
343
|
+
this.fruits[0].name = 'pineapple';
|
|
344
|
+
})
|
|
345
|
+
.width(300)
|
|
346
|
+
.margin(10)
|
|
347
|
+
}
|
|
348
|
+
.width('100%')
|
|
349
|
+
}
|
|
350
|
+
.height('100%')
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+

|
|
356
|
+
|
|
357
|
+
### 装饰Map类型变量
|
|
358
|
+
|
|
359
|
+
> **说明:**
|
|
360
|
+
>
|
|
361
|
+
> 从API version 11开始,@State支持Map类型。
|
|
362
|
+
|
|
363
|
+
在下面的示例中,@State装饰的变量fruits的类型为Map<string, number>,点击Button改变fruits的值,视图会随之刷新。
|
|
364
|
+
|
|
365
|
+
```TypeScript
|
|
366
|
+
@Entry
|
|
367
|
+
@Component
|
|
368
|
+
struct MapSample {
|
|
369
|
+
@State fruits: Map<string, number> = new Map([['apple', 1], ['banana', 2]]); // 使用@State装饰Map类型变量
|
|
370
|
+
|
|
371
|
+
build() {
|
|
372
|
+
Row() {
|
|
373
|
+
Column() {
|
|
374
|
+
ForEach(Array.from(this.fruits.entries()), (item: [string, number]) => {
|
|
375
|
+
Text(`key: ${item[0]}, value: ${item[1]}`)
|
|
376
|
+
.fontSize(20)
|
|
377
|
+
.margin(10)
|
|
378
|
+
})
|
|
379
|
+
// 新增键值对,触发UI刷新
|
|
380
|
+
Button('Set entry cherry')
|
|
381
|
+
.onClick(() => {
|
|
382
|
+
this.fruits.set('cherry', 3);
|
|
383
|
+
})
|
|
384
|
+
.width(300)
|
|
385
|
+
.margin(10)
|
|
386
|
+
// 更新键值对,触发UI刷新
|
|
387
|
+
Button('Update entry apple')
|
|
388
|
+
.onClick(() => {
|
|
389
|
+
this.fruits.set('apple', 4);
|
|
390
|
+
})
|
|
391
|
+
.width(300)
|
|
392
|
+
.margin(10)
|
|
393
|
+
// 删除键值对,触发UI刷新
|
|
394
|
+
Button('Delete entry apple')
|
|
395
|
+
.onClick(() => {
|
|
396
|
+
this.fruits.delete('apple');
|
|
397
|
+
})
|
|
398
|
+
.width(300)
|
|
399
|
+
.margin(10)
|
|
400
|
+
// 对Map整体重新赋值,触发UI刷新
|
|
401
|
+
Button('Reset map')
|
|
402
|
+
.onClick(() => {
|
|
403
|
+
this.fruits = new Map([['strawberry', 9], ['blueberry', 8]]);
|
|
404
|
+
})
|
|
405
|
+
.width(300)
|
|
406
|
+
.margin(10)
|
|
407
|
+
// 清空Map,触发UI刷新
|
|
408
|
+
Button('Clear map')
|
|
409
|
+
.onClick(() => {
|
|
410
|
+
this.fruits.clear();
|
|
411
|
+
})
|
|
412
|
+
.width(300)
|
|
413
|
+
.margin(10)
|
|
414
|
+
}
|
|
415
|
+
.width('100%')
|
|
416
|
+
}
|
|
417
|
+
.height('100%')
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+

|
|
423
|
+
|
|
424
|
+
### 装饰Set类型变量
|
|
425
|
+
|
|
426
|
+
> **说明:**
|
|
427
|
+
>
|
|
428
|
+
> 从API version 11开始,@State支持Set类型。
|
|
429
|
+
|
|
430
|
+
在下面的示例中,@State装饰的变量fruits的类型为Set<string>,点击Button改变fruits的值,视图会随之刷新。
|
|
431
|
+
|
|
432
|
+
```TypeScript
|
|
433
|
+
@Entry
|
|
434
|
+
@Component
|
|
435
|
+
struct SetSample {
|
|
436
|
+
@State fruits: Set<string> = new Set(['apple', 'banana']); // 使用@State装饰Set类型变量
|
|
437
|
+
|
|
438
|
+
build() {
|
|
439
|
+
Row() {
|
|
440
|
+
Column() {
|
|
441
|
+
ForEach(Array.from(this.fruits.entries()), (item: [string, string]) => {
|
|
442
|
+
Text(`${item[0]}`)
|
|
443
|
+
.fontSize(20)
|
|
444
|
+
.margin(10)
|
|
445
|
+
})
|
|
446
|
+
// 新增元素,触发UI刷新
|
|
447
|
+
Button('Add element')
|
|
448
|
+
.onClick(() => {
|
|
449
|
+
this.fruits.add('cherry');
|
|
450
|
+
})
|
|
451
|
+
.width(300)
|
|
452
|
+
.margin(10)
|
|
453
|
+
// 删除元素,触发UI刷新
|
|
454
|
+
Button('Delete element apple')
|
|
455
|
+
.onClick(() => {
|
|
456
|
+
this.fruits.delete('apple');
|
|
457
|
+
})
|
|
458
|
+
.width(300)
|
|
459
|
+
.margin(10)
|
|
460
|
+
// 对Set整体重新赋值,触发UI刷新
|
|
461
|
+
Button('Reset set')
|
|
462
|
+
.onClick(() => {
|
|
463
|
+
this.fruits = new Set(['strawberry', 'blueberry']);
|
|
464
|
+
})
|
|
465
|
+
.width(300)
|
|
466
|
+
.margin(10)
|
|
467
|
+
// 清空Set,触发UI刷新
|
|
468
|
+
Button('Clear set')
|
|
469
|
+
.onClick(() => {
|
|
470
|
+
this.fruits.clear();
|
|
471
|
+
})
|
|
472
|
+
.width(300)
|
|
473
|
+
.margin(10)
|
|
474
|
+
}
|
|
475
|
+
.width('100%')
|
|
476
|
+
}
|
|
477
|
+
.height('100%')
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+

|
|
483
|
+
|
|
484
|
+
### 装饰Date类型变量
|
|
485
|
+
|
|
486
|
+
在下面的示例中,@State装饰的变量selectedDate的类型为Date,点击Button改变selectedDate的值,视图会随之刷新。
|
|
487
|
+
|
|
488
|
+
```TypeScript
|
|
489
|
+
@Entry
|
|
490
|
+
@Component
|
|
491
|
+
struct DatePickerExample {
|
|
492
|
+
@State selectedDate: Date = new Date('2021-08-08'); // 使用@State装饰Date类型变量
|
|
493
|
+
|
|
494
|
+
build() {
|
|
495
|
+
Row() {
|
|
496
|
+
Column() {
|
|
497
|
+
// 通过给selectedDate重新赋值新的Date实例,触发UI刷新
|
|
498
|
+
Button('set selectedDate to 2023-07-08')
|
|
499
|
+
.onClick(() => {
|
|
500
|
+
this.selectedDate = new Date('2023-07-08');
|
|
501
|
+
})
|
|
502
|
+
.margin(10)
|
|
503
|
+
.width(300)
|
|
504
|
+
// 调用Date的setFullYear接口修改年份,触发UI刷新
|
|
505
|
+
Button('increase the year by 1')
|
|
506
|
+
.onClick(() => {
|
|
507
|
+
this.selectedDate.setFullYear(this.selectedDate.getFullYear() + 1);
|
|
508
|
+
})
|
|
509
|
+
.margin(10)
|
|
510
|
+
.width(300)
|
|
511
|
+
// 调用Date的setMonth接口修改月份,触发UI刷新
|
|
512
|
+
Button('increase the month by 1')
|
|
513
|
+
.onClick(() => {
|
|
514
|
+
this.selectedDate.setMonth(this.selectedDate.getMonth() + 1);
|
|
515
|
+
})
|
|
516
|
+
.margin(10)
|
|
517
|
+
.width(300)
|
|
518
|
+
// 调用Date的setDate接口修改日期,触发UI刷新
|
|
519
|
+
Button('increase the day by 1')
|
|
520
|
+
.onClick(() => {
|
|
521
|
+
this.selectedDate.setDate(this.selectedDate.getDate() + 1);
|
|
522
|
+
})
|
|
523
|
+
.margin(10)
|
|
524
|
+
.width(300)
|
|
525
|
+
DatePicker({
|
|
526
|
+
start: new Date('1970-1-1'),
|
|
527
|
+
end: new Date('2100-1-1'),
|
|
528
|
+
selected: this.selectedDate
|
|
529
|
+
}).margin(20)
|
|
530
|
+
}
|
|
531
|
+
.width('100%')
|
|
532
|
+
}
|
|
533
|
+
.height('100%')
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+

|
|
539
|
+
|
|
540
|
+
### State支持联合类型实例
|
|
541
|
+
|
|
542
|
+
@State支持联合类型和undefined和null,在下面的示例中,count类型为number | undefined,点击Button改变count的值,视图会随之刷新。
|
|
543
|
+
|
|
544
|
+
```TypeScript
|
|
545
|
+
@Entry
|
|
546
|
+
@Component
|
|
547
|
+
struct UnionTypeSample {
|
|
548
|
+
@State count: number | undefined = 0; // 使用@State装饰联合类型变量
|
|
549
|
+
|
|
550
|
+
build() {
|
|
551
|
+
Row() {
|
|
552
|
+
Column() {
|
|
553
|
+
Text(`count: ${this.count}`)
|
|
554
|
+
// 将联合类型变量从number切换为undefined,触发UI刷新
|
|
555
|
+
Button('change to undefined')
|
|
556
|
+
.onClick(() => {
|
|
557
|
+
this.count = undefined;
|
|
558
|
+
})
|
|
559
|
+
.width(300)
|
|
560
|
+
.margin(10)
|
|
561
|
+
// 将联合类型变量从undefined切换为number,触发UI刷新
|
|
562
|
+
Button('change to number')
|
|
563
|
+
.onClick(() => {
|
|
564
|
+
this.count = 10;
|
|
565
|
+
})
|
|
566
|
+
.width(300)
|
|
567
|
+
.margin(10)
|
|
568
|
+
}
|
|
569
|
+
.width('100%')
|
|
570
|
+
}
|
|
571
|
+
.height('100%')
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+

|