@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,648 @@
|
|
|
1
|
+
# @Link装饰器:父子双向同步
|
|
2
|
+
|
|
3
|
+
子组件中被@Link装饰的变量与其父组件中对应的数据源建立双向数据绑定。
|
|
4
|
+
|
|
5
|
+
在阅读@Link文档前,建议先熟悉[@State](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state)的基本用法。最佳实践请参考[状态管理最佳实践](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)。
|
|
6
|
+
|
|
7
|
+
> **说明:**
|
|
8
|
+
>
|
|
9
|
+
> 从API version 9开始,该装饰器支持在ArkTS卡片中使用。
|
|
10
|
+
>
|
|
11
|
+
> 从API version 11开始,该装饰器支持在元服务中使用。
|
|
12
|
+
|
|
13
|
+
## 概述
|
|
14
|
+
|
|
15
|
+
@Link装饰的变量与其父组件中的数据源共享相同的值。
|
|
16
|
+
|
|
17
|
+
## 装饰器使用规则说明
|
|
18
|
+
|
|
19
|
+
| @Link变量装饰器 | 说明 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| 装饰器参数 | 无。 |
|
|
22
|
+
| 同步类型 | 双向同步。父组件状态变量与子组件@Link建立双向同步,当其中一方改变时,另一方也会同步更新。 |
|
|
23
|
+
| 允许装饰的变量类型 | 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)类型以及这些类型的联合类型,示例见[Link支持联合类型实例](#link支持联合类型实例)。支持类型的场景请参考[观察变化](#观察变化)。 |
|
|
24
|
+
| 不允许装饰的变量类型 | 不支持装饰Function类型。 |
|
|
25
|
+
| 被装饰变量的初始值 | 禁止本地初始化。 |
|
|
26
|
+
|
|
27
|
+
## 变量的传递/访问规则说明
|
|
28
|
+
|
|
29
|
+
| 传递/访问 | 说明 |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| 从父组件初始化和更新 | 必选。允许父组件中[@State](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state)、@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)装饰变量初始化子组件@Link,并建立双向绑定。- 从API version 9开始,@Link子组件从父组件初始化@State的语法为Comp({ aLink: this.aState }),同样支持Comp({aLink: $aState})。 |
|
|
32
|
+
| 用于初始化子组件 | 允许,可用于初始化常规变量、@State、@Link、@Prop、@Provide。 |
|
|
33
|
+
| 是否支持组件外访问 | 私有,只能在所属组件内访问。 |
|
|
34
|
+
|
|
35
|
+
**图1** 初始化规则示意图
|
|
36
|
+
|
|
37
|
+

|
|
38
|
+
|
|
39
|
+
## 观察变化和行为表现
|
|
40
|
+
|
|
41
|
+
### 观察变化
|
|
42
|
+
|
|
43
|
+
- 当装饰的数据类型为boolean、string、number类型时,可以同步观察到数值的变化,示例请参考[简单类型和类对象类型的@Link](#简单类型和类对象类型的link)。
|
|
44
|
+
- 当装饰的数据类型为class或者Object时,可以观察到赋值和属性赋值的变化,即Object.keys(observedObject)返回的所有属性,示例请参考[简单类型和类对象类型的@Link](#简单类型和类对象类型的link)。@Link仅能观察对象本身及其一层属性的变化,无法观察嵌套场景(如嵌套对象、对象数组)内层数据的变化,该场景请参考[@Observed装饰器与@ObjectLink装饰器的使用场景](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-observed-and-objectlink#使用场景)。
|
|
45
|
+
- 当装饰的对象是Array时,可以观察到数组添加、删除、更新数组单元的变化,示例请参考[数组类型的@Link](#数组类型的link)。
|
|
46
|
+
- 当装饰的对象是Date时,可以观察到Date的整体赋值,以及通过调用setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds, setTime, setUTCFullYear, setUTCMonth, setUTCDate, setUTCHours, setUTCMinutes, setUTCSeconds, setUTCMilliseconds方法更新其属性,示例请参考[装饰Date类型变量](#装饰date类型变量)。
|
|
47
|
+
- 当装饰的变量是Map时,可以观察到Map整体的赋值,以及可通过调用Map的set、clear、delete接口更新Map的值,示例请参考[装饰Map类型变量](#装饰map类型变量)。
|
|
48
|
+
- 当装饰的变量是Set时,可以观察Set整体的赋值,以及通过调用Set的add、clear、delete接口更新其值,示例请参考[装饰Set类型变量](#装饰set类型变量)。
|
|
49
|
+
|
|
50
|
+
### 框架行为
|
|
51
|
+
|
|
52
|
+
@Link装饰的变量和所属的自定义组件共享生命周期。
|
|
53
|
+
|
|
54
|
+
为了了解@Link变量的初始化和更新机制,有必要先了解父组件和拥有@Link变量的子组件的关系,以及初始渲染和双向更新的流程(以父组件为@State为例)。
|
|
55
|
+
|
|
56
|
+
1. 初始渲染:执行父组件的 build() 函数,创建子组件的新实例。初始化过程如下:
|
|
57
|
+
1. 指定父组件中的@State变量用于初始化子组件的@Link变量。子组件的@Link变量值与其父组件的数据源变量保持双向数据同步。
|
|
58
|
+
2. 父组件的@State状态变量包装类通过构造函数传给子组件,子组件的@Link包装类拿到父组件的@State的状态变量后,将当前@Link包装类实例注册给父组件的@State变量。
|
|
59
|
+
|
|
60
|
+
2. @Link的数据源的更新:即父组件中状态变量更新,引起相关子组件的@Link的更新。处理步骤:
|
|
61
|
+
1. 通过初始渲染的步骤可知,子组件@Link包装类把当前this指针注册给父组件。父组件@State变量变更后,会遍历更新所有依赖它的系统组件和状态变量(例如:@Link包装类)。
|
|
62
|
+
2. 通知@Link包装类更新后,子组件中所有依赖@Link状态变量的系统组件都会被通知更新。以此实现父组件对子组件的状态数据同步。
|
|
63
|
+
|
|
64
|
+
3. @Link的更新:当子组件中@Link更新后,处理步骤如下(以父组件为@State为例):
|
|
65
|
+
1. @Link更新后,调用父组件的@State包装类的set方法,将数值同步回父组件。
|
|
66
|
+
2. 子组件@Link和父组件@State分别遍历依赖的系统组件,更新对应的UI。从而实现子组件@Link与父组件@State的同步。
|
|
67
|
+
|
|
68
|
+
## 限制条件
|
|
69
|
+
|
|
70
|
+
1. @Link装饰器不建议在[@Entry](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-create-custom-components#entry)装饰的自定义组件中使用,否则编译时会抛出警告;若该自定义组件作为页面根节点使用,则会抛出运行时错误。
|
|
71
|
+
|
|
72
|
+
2. @Link装饰的变量禁止本地初始化,否则编译期会报错。
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
// 错误写法,编译报错
|
|
76
|
+
@Link count: number = 10;
|
|
77
|
+
|
|
78
|
+
// 正确写法
|
|
79
|
+
@Link count: number;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
3. @Link装饰的变量的类型要和数据源类型保持一致,否则编译期会报错。同时,数据源必须是状态变量,否则框架会抛出运行时错误。
|
|
83
|
+
|
|
84
|
+
【反例】
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
class Info {
|
|
88
|
+
value: string = 'Hello';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
class Cousin {
|
|
92
|
+
name: string = 'Hello';
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@Component
|
|
96
|
+
struct Child {
|
|
97
|
+
// 错误写法1:@Link装饰的变量与@State装饰的变量类型不一致
|
|
98
|
+
@Link test: Cousin;
|
|
99
|
+
// 错误写法2:数据源非状态变量
|
|
100
|
+
@Link testStr: string;
|
|
101
|
+
|
|
102
|
+
build() {
|
|
103
|
+
Column() {
|
|
104
|
+
Text(this.test.name)
|
|
105
|
+
Text(this.testStr)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@Entry
|
|
111
|
+
@Component
|
|
112
|
+
struct LinkExample {
|
|
113
|
+
@State info: Info = new Info();
|
|
114
|
+
|
|
115
|
+
build() {
|
|
116
|
+
Column() {
|
|
117
|
+
Child({
|
|
118
|
+
// 错误写法1:@Link装饰的变量与@State装饰的变量类型不一致
|
|
119
|
+
test: this.info,
|
|
120
|
+
// 错误写法2:数据源非状态变量
|
|
121
|
+
testStr: this.info.value
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
【正例】
|
|
129
|
+
|
|
130
|
+
```TypeScript
|
|
131
|
+
class LinkInfo {
|
|
132
|
+
public value: string = 'Hello';
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@Component
|
|
136
|
+
struct LinkChild {
|
|
137
|
+
// 在子组件中,使用@Link装饰LinkInfo类型的test变量
|
|
138
|
+
@Link test: LinkInfo;
|
|
139
|
+
|
|
140
|
+
build() {
|
|
141
|
+
Text(this.test.value)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@Entry
|
|
146
|
+
@Component
|
|
147
|
+
struct LinkExample {
|
|
148
|
+
@State info: LinkInfo = new LinkInfo();
|
|
149
|
+
|
|
150
|
+
build() {
|
|
151
|
+
Column() {
|
|
152
|
+
// 在父组件中,使用@State装饰的info变量初始化LinkChild组件的test变量
|
|
153
|
+
LinkChild({test: this.info})
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
4. @Link装饰的变量仅能被状态变量初始化,不能使用常规变量初始化,否则编译期会给出告警,并在运行时崩溃。
|
|
160
|
+
|
|
161
|
+
【反例】
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
class Info {
|
|
165
|
+
info: string = 'Hello';
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@Component
|
|
169
|
+
struct Child {
|
|
170
|
+
@Link msg: string;
|
|
171
|
+
@Link info: string;
|
|
172
|
+
|
|
173
|
+
build() {
|
|
174
|
+
Text(this.msg + this.info)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@Entry
|
|
179
|
+
@Component
|
|
180
|
+
struct LinkExample {
|
|
181
|
+
@State message: string = 'Hello';
|
|
182
|
+
@State info: Info = new Info();
|
|
183
|
+
|
|
184
|
+
build() {
|
|
185
|
+
Column() {
|
|
186
|
+
// 错误写法,常规变量不能初始化@Link
|
|
187
|
+
Child({msg: 'World', info: this.info.info})
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
【正例】
|
|
194
|
+
|
|
195
|
+
```TypeScript
|
|
196
|
+
class LinkInfo2 {
|
|
197
|
+
public info: string = 'Hello';
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@Component
|
|
201
|
+
struct LinkChild2 {
|
|
202
|
+
@Link msg: string;
|
|
203
|
+
@Link info: LinkInfo2;
|
|
204
|
+
|
|
205
|
+
build() {
|
|
206
|
+
Text(this.msg + this.info.info)
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
@Entry
|
|
211
|
+
@Component
|
|
212
|
+
struct LinkExample2 {
|
|
213
|
+
@State message: string = 'Hello';
|
|
214
|
+
@State info: LinkInfo2 = new LinkInfo2();
|
|
215
|
+
|
|
216
|
+
build() {
|
|
217
|
+
Column() {
|
|
218
|
+
// 正确写法
|
|
219
|
+
LinkChild2({msg: this.message, info: this.info})
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
5. @Link不支持装饰Function类型的变量,框架会抛出运行时错误。
|
|
226
|
+
|
|
227
|
+
## 使用场景
|
|
228
|
+
|
|
229
|
+
### 简单类型和类对象类型的@Link
|
|
230
|
+
|
|
231
|
+
以下示例中,点击父组件ShufflingContainer中的"Parent View: Set yellowButton"和"Parent View: Set GreenButton",可以从父组件将变化同步给子组件。
|
|
232
|
+
|
|
233
|
+
1.点击子组件GreenButton和YellowButton中的Button,子组件会发生相应变化,将变化同步给父组件。因为@Link是双向同步,会将变化同步给@State。
|
|
234
|
+
|
|
235
|
+
2.当点击父组件ShufflingContainer中的Button时,@State会发生变化,并同步给@Link,子组件也会进行对应的刷新。
|
|
236
|
+
|
|
237
|
+
```TypeScript
|
|
238
|
+
class GreenButtonState {
|
|
239
|
+
public width: number = 0;
|
|
240
|
+
|
|
241
|
+
constructor(width: number) {
|
|
242
|
+
this.width = width;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
@Component
|
|
247
|
+
struct GreenButton {
|
|
248
|
+
@Link greenButtonState: GreenButtonState;
|
|
249
|
+
|
|
250
|
+
build() {
|
|
251
|
+
Button('Green Button')
|
|
252
|
+
.width(this.greenButtonState.width)
|
|
253
|
+
.height(40)
|
|
254
|
+
.backgroundColor('#64bb5c')
|
|
255
|
+
.fontColor('#FFFFFF')
|
|
256
|
+
.onClick(() => {
|
|
257
|
+
if (this.greenButtonState.width < 700) {
|
|
258
|
+
// 更新class的属性,变化可以被观察到同步回父组件
|
|
259
|
+
this.greenButtonState.width += 60;
|
|
260
|
+
} else {
|
|
261
|
+
// 更新class,变化可以被观察到同步回父组件
|
|
262
|
+
this.greenButtonState = new GreenButtonState(180);
|
|
263
|
+
}
|
|
264
|
+
})
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@Component
|
|
269
|
+
struct YellowButton {
|
|
270
|
+
@Link yellowButtonState: number;
|
|
271
|
+
|
|
272
|
+
build() {
|
|
273
|
+
Button('Yellow Button')
|
|
274
|
+
.width(this.yellowButtonState)
|
|
275
|
+
.height(40)
|
|
276
|
+
.backgroundColor('#f7ce00')
|
|
277
|
+
.fontColor('#FFFFFF')
|
|
278
|
+
.onClick(() => {
|
|
279
|
+
// 子组件的简单类型可以同步回父组件
|
|
280
|
+
this.yellowButtonState += 40.0;
|
|
281
|
+
})
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
@Entry
|
|
286
|
+
@Component
|
|
287
|
+
struct ShufflingContainer {
|
|
288
|
+
@State greenButtonState: GreenButtonState = new GreenButtonState(180);
|
|
289
|
+
@State yellowButtonProp: number = 180;
|
|
290
|
+
|
|
291
|
+
build() {
|
|
292
|
+
Column() {
|
|
293
|
+
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) {
|
|
294
|
+
// 简单类型从父组件@State向子组件@Link数据同步
|
|
295
|
+
Button('Parent View: Set yellowButton')
|
|
296
|
+
.width(this.yellowButtonProp)
|
|
297
|
+
.height(40)
|
|
298
|
+
.margin(12)
|
|
299
|
+
.fontColor('#FFFFFF')
|
|
300
|
+
.onClick(() => {
|
|
301
|
+
this.yellowButtonProp = (this.yellowButtonProp < 700) ? this.yellowButtonProp + 40 : 100;
|
|
302
|
+
})
|
|
303
|
+
// class类型从父组件@State向子组件@Link数据同步
|
|
304
|
+
Button('Parent View: Set GreenButton')
|
|
305
|
+
.width(this.greenButtonState.width)
|
|
306
|
+
.height(40)
|
|
307
|
+
.margin(12)
|
|
308
|
+
.fontColor('#FFFFFF')
|
|
309
|
+
.onClick(() => {
|
|
310
|
+
this.greenButtonState.width = (this.greenButtonState.width < 700) ? this.greenButtonState.width + 100 : 100;
|
|
311
|
+
})
|
|
312
|
+
// class类型初始化@Link
|
|
313
|
+
GreenButton({ greenButtonState: this.greenButtonState }).margin(12)
|
|
314
|
+
// 简单类型初始化@Link
|
|
315
|
+
YellowButton({ yellowButtonState: this.yellowButtonProp }).margin(12)
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+

|
|
323
|
+
|
|
324
|
+
### 数组类型的@Link
|
|
325
|
+
|
|
326
|
+
```TypeScript
|
|
327
|
+
@Component
|
|
328
|
+
struct ArrayTypesChild {
|
|
329
|
+
@Link items: number[];
|
|
330
|
+
|
|
331
|
+
build() {
|
|
332
|
+
Column() {
|
|
333
|
+
Button(`Button1: push`)
|
|
334
|
+
.margin(12)
|
|
335
|
+
.width(312)
|
|
336
|
+
.height(40)
|
|
337
|
+
.fontColor('#FFFFFF')
|
|
338
|
+
.onClick(() => {
|
|
339
|
+
this.items.push(this.items.length + 1);
|
|
340
|
+
})
|
|
341
|
+
Button(`Button2: replace whole item`)
|
|
342
|
+
.margin(12)
|
|
343
|
+
.width(312)
|
|
344
|
+
.height(40)
|
|
345
|
+
.fontColor('#FFFFFF')
|
|
346
|
+
.onClick(() => {
|
|
347
|
+
this.items = [100, 200, 300];
|
|
348
|
+
})
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
@Entry
|
|
354
|
+
@Component
|
|
355
|
+
struct ArrayTypes {
|
|
356
|
+
@State arr: number[] = [1, 2, 3];
|
|
357
|
+
|
|
358
|
+
build() {
|
|
359
|
+
Column() {
|
|
360
|
+
ArrayTypesChild({ items: $arr })
|
|
361
|
+
.margin(12)
|
|
362
|
+
ForEach(this.arr,
|
|
363
|
+
(item: number) => {
|
|
364
|
+
Button(`${item}`)
|
|
365
|
+
.margin(12)
|
|
366
|
+
.width(312)
|
|
367
|
+
.height(40)
|
|
368
|
+
.backgroundColor('#11a2a2a2')
|
|
369
|
+
.fontColor('#e6000000')
|
|
370
|
+
},
|
|
371
|
+
(item: ForEachInterface) => item.toString()
|
|
372
|
+
)
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+

|
|
379
|
+
|
|
380
|
+
状态管理框架可以观察到数组元素的添加、删除和替换。在该示例中,@State和@Link的类型均为number[],不支持将@Link定义成number类型(@Link item : number),并用@State数组中的每个数据项在父组件中创建子组件。如需使用这种场景,可以参考[@Prop](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-prop)和[@Observed](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-observed-and-objectlink)。
|
|
381
|
+
|
|
382
|
+
### 装饰Map类型变量
|
|
383
|
+
|
|
384
|
+
> **说明:**
|
|
385
|
+
>
|
|
386
|
+
> 从API version 11开始,@Link支持Map类型。
|
|
387
|
+
|
|
388
|
+
在下面的示例中,value类型为Map<number, string>,点击Button改变message的值,视图会随之刷新。
|
|
389
|
+
|
|
390
|
+
```TypeScript
|
|
391
|
+
@Component
|
|
392
|
+
struct MapSampleChild {
|
|
393
|
+
@Link value: Map<number, string>;
|
|
394
|
+
|
|
395
|
+
build() {
|
|
396
|
+
Column() {
|
|
397
|
+
ForEach(Array.from(this.value.entries()), (item: [number, string]) => {
|
|
398
|
+
Text(`${item[0]}`).fontSize(30)
|
|
399
|
+
Text(`${item[1]}`).fontSize(30)
|
|
400
|
+
Divider()
|
|
401
|
+
})
|
|
402
|
+
Button('child init map').onClick(() => {
|
|
403
|
+
this.value = new Map([[0, 'a'], [1, 'b'], [3, 'c']]);
|
|
404
|
+
})
|
|
405
|
+
Button('child set new one').onClick(() => {
|
|
406
|
+
this.value.set(4, 'd');
|
|
407
|
+
})
|
|
408
|
+
Button('child clear').onClick(() => {
|
|
409
|
+
this.value.clear();
|
|
410
|
+
})
|
|
411
|
+
Button('child replace the first one').onClick(() => {
|
|
412
|
+
this.value.set(0, 'aa');
|
|
413
|
+
})
|
|
414
|
+
Button('child delete the first one').onClick(() => {
|
|
415
|
+
this.value.delete(0);
|
|
416
|
+
})
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
@Entry
|
|
423
|
+
@Component
|
|
424
|
+
struct MapSample {
|
|
425
|
+
@State message: Map<number, string> = new Map([[0, 'a'], [1, 'b'], [3, 'c']]);
|
|
426
|
+
|
|
427
|
+
build() {
|
|
428
|
+
Row() {
|
|
429
|
+
Column() {
|
|
430
|
+
MapSampleChild({ value: this.message })
|
|
431
|
+
}
|
|
432
|
+
.width('100%')
|
|
433
|
+
}
|
|
434
|
+
.height('100%')
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### 装饰Set类型变量
|
|
440
|
+
|
|
441
|
+
> **说明:**
|
|
442
|
+
>
|
|
443
|
+
> 从API version 11开始,@Link支持Set类型。
|
|
444
|
+
|
|
445
|
+
在下面的示例中,message类型为Set<number>,点击Button改变message的值,视图会随之刷新。
|
|
446
|
+
|
|
447
|
+
```TypeScript
|
|
448
|
+
@Component
|
|
449
|
+
struct SetSampleChild {
|
|
450
|
+
@Link message: Set<number>;
|
|
451
|
+
|
|
452
|
+
build() {
|
|
453
|
+
Column() {
|
|
454
|
+
ForEach(Array.from(this.message.entries()), (item: [number, number]) => {
|
|
455
|
+
Text(`${item[0]}`).fontSize(30)
|
|
456
|
+
Divider()
|
|
457
|
+
})
|
|
458
|
+
Button('init set').onClick(() => {
|
|
459
|
+
this.message = new Set([0, 1, 2, 3, 4]);
|
|
460
|
+
})
|
|
461
|
+
Button('set new one').onClick(() => {
|
|
462
|
+
this.message.add(5);
|
|
463
|
+
})
|
|
464
|
+
Button('clear').onClick(() => {
|
|
465
|
+
this.message.clear();
|
|
466
|
+
})
|
|
467
|
+
Button('delete the first one').onClick(() => {
|
|
468
|
+
this.message.delete(0);
|
|
469
|
+
})
|
|
470
|
+
}
|
|
471
|
+
.width('100%')
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
@Entry
|
|
477
|
+
@Component
|
|
478
|
+
struct SetSample {
|
|
479
|
+
@State message: Set<number> = new Set([0, 1, 2, 3, 4]);
|
|
480
|
+
|
|
481
|
+
build() {
|
|
482
|
+
Row() {
|
|
483
|
+
Column() {
|
|
484
|
+
SetSampleChild({ message: this.message })
|
|
485
|
+
}
|
|
486
|
+
.width('100%')
|
|
487
|
+
}
|
|
488
|
+
.height('100%')
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### 装饰Date类型变量
|
|
494
|
+
|
|
495
|
+
在下面的示例中,selectedDate类型为Date,点击Button改变selectedDate的值,视图会随之刷新。
|
|
496
|
+
|
|
497
|
+
```TypeScript
|
|
498
|
+
@Component
|
|
499
|
+
struct DateComponent {
|
|
500
|
+
@Link selectedDate: Date;
|
|
501
|
+
|
|
502
|
+
build() {
|
|
503
|
+
Column() {
|
|
504
|
+
Button(`child increase the year by 1`)
|
|
505
|
+
.onClick(() => {
|
|
506
|
+
this.selectedDate.setFullYear(this.selectedDate.getFullYear() + 1);
|
|
507
|
+
})
|
|
508
|
+
Button('child update the new date')
|
|
509
|
+
.margin(10)
|
|
510
|
+
.onClick(() => {
|
|
511
|
+
this.selectedDate = new Date('2023-09-09');
|
|
512
|
+
})
|
|
513
|
+
DatePicker({
|
|
514
|
+
start: new Date('1970-1-1'),
|
|
515
|
+
end: new Date('2100-1-1'),
|
|
516
|
+
selected: this.selectedDate
|
|
517
|
+
})
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
@Entry
|
|
523
|
+
@Component
|
|
524
|
+
struct ParentComponent {
|
|
525
|
+
@State parentSelectedDate: Date = new Date('2021-08-08');
|
|
526
|
+
|
|
527
|
+
build() {
|
|
528
|
+
Column() {
|
|
529
|
+
Button('parent increase the month by 1')
|
|
530
|
+
.margin(10)
|
|
531
|
+
.onClick(() => {
|
|
532
|
+
this.parentSelectedDate.setMonth(this.parentSelectedDate.getMonth() + 1);
|
|
533
|
+
})
|
|
534
|
+
Button('parent update the new date')
|
|
535
|
+
.margin(10)
|
|
536
|
+
.onClick(() => {
|
|
537
|
+
this.parentSelectedDate = new Date('2023-07-07');
|
|
538
|
+
})
|
|
539
|
+
DatePicker({
|
|
540
|
+
start: new Date('1970-1-1'),
|
|
541
|
+
end: new Date('2100-1-1'),
|
|
542
|
+
selected: this.parentSelectedDate
|
|
543
|
+
})
|
|
544
|
+
|
|
545
|
+
DateComponent({ selectedDate:this.parentSelectedDate })
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
### 使用双向同步机制更改本地其他变量
|
|
552
|
+
|
|
553
|
+
通过[@Watch](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-watch)可以在双向同步时更改本地变量。
|
|
554
|
+
|
|
555
|
+
以下示例中,在@Link的@Watch里面修改了一个@State装饰的变量memberMessage,实现父子组件间的变量同步。但是@State装饰的变量memberMessage在本地修改不会影响到父组件中的变量改变。
|
|
556
|
+
|
|
557
|
+
```TypeScript
|
|
558
|
+
@Entry
|
|
559
|
+
@Component
|
|
560
|
+
struct ChangeVariables {
|
|
561
|
+
@State sourceNumber: number = 0;
|
|
562
|
+
|
|
563
|
+
build() {
|
|
564
|
+
Column() {
|
|
565
|
+
Text(`sourceNumber of the parent component:` + this.sourceNumber)
|
|
566
|
+
ChangeVariablesChild({ sourceNumber: this.sourceNumber })
|
|
567
|
+
Button('Change sourceNumber in Parent Component')
|
|
568
|
+
.onClick(() => {
|
|
569
|
+
this.sourceNumber++;
|
|
570
|
+
})
|
|
571
|
+
}
|
|
572
|
+
.width('100%')
|
|
573
|
+
.height('100%')
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
@Component
|
|
578
|
+
struct ChangeVariablesChild {
|
|
579
|
+
@State memberMessage: string = 'Hello World';
|
|
580
|
+
@Link @Watch('onSourceChange') sourceNumber: number;
|
|
581
|
+
|
|
582
|
+
onSourceChange() {
|
|
583
|
+
this.memberMessage = this.sourceNumber.toString();
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
build() {
|
|
587
|
+
Column() {
|
|
588
|
+
Text(this.memberMessage)
|
|
589
|
+
Text(`sourceNumber of the child component:` + this.sourceNumber.toString())
|
|
590
|
+
Button('Change memberMessage in Child Component')
|
|
591
|
+
.onClick(() => {
|
|
592
|
+
this.memberMessage = 'Hello memberMessage';
|
|
593
|
+
})
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
### Link支持联合类型实例
|
|
600
|
+
|
|
601
|
+
@Link支持联合类型、undefined和null。在以下示例中,name类型为string | undefined。点击父组件UnionTypes中的按钮可以改变name的属性或类型,UnionChild组件也会相应刷新。
|
|
602
|
+
|
|
603
|
+
```TypeScript
|
|
604
|
+
@Component
|
|
605
|
+
struct UnionChild {
|
|
606
|
+
@Link name: string | undefined;
|
|
607
|
+
|
|
608
|
+
build() {
|
|
609
|
+
Column() {
|
|
610
|
+
|
|
611
|
+
Button('Child change name to Bob')
|
|
612
|
+
.onClick(() => {
|
|
613
|
+
this.name = 'Bob';
|
|
614
|
+
})
|
|
615
|
+
|
|
616
|
+
Button('Child change name to undefined')
|
|
617
|
+
.onClick(() => {
|
|
618
|
+
this.name = undefined;
|
|
619
|
+
})
|
|
620
|
+
|
|
621
|
+
}.width('100%')
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
@Entry
|
|
626
|
+
@Component
|
|
627
|
+
struct UnionTypes {
|
|
628
|
+
@State name: string | undefined = 'mary';
|
|
629
|
+
|
|
630
|
+
build() {
|
|
631
|
+
Column() {
|
|
632
|
+
Text(`The name is ${this.name}`).fontSize(30)
|
|
633
|
+
|
|
634
|
+
UnionChild({ name: this.name })
|
|
635
|
+
|
|
636
|
+
Button('Parents change name to Peter')
|
|
637
|
+
.onClick(() => {
|
|
638
|
+
this.name = 'Peter';
|
|
639
|
+
})
|
|
640
|
+
|
|
641
|
+
Button('Parents change name to undefined')
|
|
642
|
+
.onClick(() => {
|
|
643
|
+
this.name = undefined;
|
|
644
|
+
})
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
```
|