android2harmony 0.1.4 → 0.1.6
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 +1 -407
- package/agents/self-tester.md +55 -376
- package/dist/index.js +238 -124
- package/dist/index.js.map +4 -4
- package/package.json +36 -32
- package/skills/a2h-resource-convert/SKILL.md +931 -0
- package/skills/a2h-resource-convert/references/code-vector-icon-rules.md +335 -0
- package/skills/{hmos-resources-convert → a2h-resource-convert}/references/conversion-rules.md +15 -2
- package/skills/{hmos-resources-convert → a2h-resource-convert}/references/dependency-analysis-rules.md +24 -2
- package/skills/a2h-resource-convert/references/lottie-conversion-rules.md +219 -0
- package/skills/{hmos-resources-convert → a2h-resource-convert}/references/resource-mapping-rules.md +27 -2
- package/skills/{hmos-resources-convert → a2h-resource-convert}/references/xml-drawable-to-svg-rules.md +118 -1
- package/skills/a2h-resource-convert/scripts/a2h_resource_convert.js +2186 -0
- package/skills/a2h-resource-convert/scripts/app_identity.js +741 -0
- package/skills/a2h-resource-convert/scripts/code_vector_icons.js +607 -0
- package/skills/a2h-resource-convert/scripts/package.json +3 -0
- package/skills/a2h-resource-convert/scripts/svg_fidelity_check.js +632 -0
- package/skills/a2h-ui-transfer/SKILL.md +431 -0
- package/skills/a2h-ui-transfer/references/conversion-procedure.md +547 -0
- package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/_/350/214/203/345/274/217/351/200/211/346/213/251/350/257/264/346/230/216.md +1 -1
- package/skills/a2h-ui-transfer/references/mvvm-v2/_/350/243/205/351/245/260/345/231/250/351/200/237/346/237/245.md +133 -0
- package/skills/{hmos-batch-ui-align/scripts/android_parse_fast.ts → a2h-ui-transfer/scripts/android_parse_fast.js} +532 -301
- package/skills/a2h-ui-transfer/scripts/arkts_static_check.js +1624 -0
- package/skills/a2h-ui-transfer/scripts/measure_pack.js +1005 -0
- package/skills/a2h-ui-transfer/scripts/package.json +3 -0
- package/skills/hmos-fix-build-errors/SKILL.md +1 -1
- package/skills/hmos-incremental-ui-align/README.md +15 -15
- package/skills/hmos-incremental-ui-align/SKILL.md +15 -15
- package/skills/hmos-incremental-ui-align/references/State_Model_Template.md +2 -2
- package/skills/hmos-incremental-ui-align/scripts/app_feature_verify.js +790 -0
- package/skills/hmos-incremental-ui-align/scripts/extract_checklist.js +285 -0
- package/skills/hmos-incremental-ui-align/scripts/navigation-capure.md +76 -76
- package/skills/hmos-incremental-ui-align/scripts/page_capture.js +756 -0
- package/skills/hmos-incremental-ui-align/scripts/page_capture_burst.js +155 -0
- package/skills/hmos-integration-test/README.md +341 -0
- package/skills/hmos-integration-test/SKILL.md +446 -0
- package/skills/hmos-integration-test/scripts/report-tool.mjs +646 -0
- package/skills/hmos-integration-test/scripts/resolve-metadata-tool.mjs +147 -0
- package/skills/hmos-integration-test/scripts/self-test-runner.mjs +1006 -0
- package/skills/hmos-integration-test/scripts/testcases-tool.mjs +189 -0
- package/skills/hmos-spec-generate/SKILL.md +26 -24
- package/skills/hmos-spec-generate/scripts/parse_requirements.ts +515 -0
- package/skills/hmos-spec-generate/template/REQ.txt +22 -0
- package/skills/hmos-spec-generate/template/REQ.xlsx +0 -0
- package/skills/hmos-batch-ui-align/SKILL.md +0 -141
- package/skills/hmos-batch-ui-align/references/conversion-procedure.md +0 -217
- package/skills/hmos-incremental-ui-align/scripts/app_feature_verify.ts +0 -999
- package/skills/hmos-incremental-ui-align/scripts/extract_checklist.ts +0 -343
- package/skills/hmos-incremental-ui-align/scripts/page_capture.ts +0 -977
- package/skills/hmos-incremental-ui-align/scripts/page_capture_burst.ts +0 -188
- package/skills/hmos-resources-convert/SKILL.md +0 -654
- package/skills/hmos-resources-convert/template/AppScope/app.json5 +0 -10
- package/skills/hmos-resources-convert/template/AppScope/resources/base/element/string.json +0 -8
- 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 +0 -7
- package/skills/hmos-resources-convert/template/build-profile.json5 +0 -42
- package/skills/hmos-resources-convert/template/code-linter.json5 +0 -32
- package/skills/hmos-resources-convert/template/entry/build-profile.json5 +0 -33
- package/skills/hmos-resources-convert/template/entry/hvigorfile.ts +0 -6
- package/skills/hmos-resources-convert/template/entry/obfuscation-rules.txt +0 -23
- package/skills/hmos-resources-convert/template/entry/oh-package.json5 +0 -10
- package/skills/hmos-resources-convert/template/entry/src/main/ets/entryability/EntryAbility.ets +0 -48
- package/skills/hmos-resources-convert/template/entry/src/main/ets/entrybackupability/EntryBackupAbility.ets +0 -16
- package/skills/hmos-resources-convert/template/entry/src/main/ets/pages/Index.ets +0 -23
- package/skills/hmos-resources-convert/template/entry/src/main/module.json5 +0 -55
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/color.json +0 -8
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/float.json +0 -8
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/element/string.json +0 -16
- 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 +0 -7
- 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 +0 -3
- package/skills/hmos-resources-convert/template/entry/src/main/resources/base/profile/main_pages.json +0 -5
- package/skills/hmos-resources-convert/template/entry/src/main/resources/dark/element/color.json +0 -8
- package/skills/hmos-resources-convert/template/entry/src/mock/mock-config.json5 +0 -2
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/Ability.test.ets +0 -35
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/ets/test/List.test.ets +0 -5
- package/skills/hmos-resources-convert/template/entry/src/ohosTest/module.json5 +0 -16
- package/skills/hmos-resources-convert/template/entry/src/test/List.test.ets +0 -5
- package/skills/hmos-resources-convert/template/entry/src/test/LocalUnit.test.ets +0 -33
- package/skills/hmos-resources-convert/template/hvigor/hvigor-config.json5 +0 -23
- package/skills/hmos-resources-convert/template/hvigorfile.ts +0 -6
- package/skills/hmos-resources-convert/template/oh-package-lock.json5 +0 -28
- package/skills/hmos-resources-convert/template/oh-package.json5 +0 -10
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-atomic-component-mapping-reference.md +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-interaction-mapping-reference.md +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mappings/android-to-harmonyOS-ui-layout-mapping-reference.md +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm/MVVM/346/250/241/345/274/217/357/274/210V1/357/274/211.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/!!/350/257/255/346/263/225/357/274/232/345/217/214/345/220/221/347/273/221/345/256/232.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Computed/350/243/205/351/245/260/345/231/250/357/274/232/350/256/241/347/256/227/345/261/236/346/200/247.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Event/350/243/205/351/245/260/345/231/250/357/274/232/350/247/204/350/214/203/347/273/204/344/273/266/350/276/223/345/207/272.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Local/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/206/205/351/203/250/347/212/266/346/200/201.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Monitor/350/243/205/351/245/260/345/231/250/357/274/232/347/212/266/346/200/201/345/217/230/351/207/217/344/277/256/346/224/271/345/274/202/346/255/245/347/233/221/345/220/254.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@ObservedV2/350/243/205/351/245/260/345/231/250/345/222/214@Trace/350/243/205/351/245/260/345/231/250/357/274/232/347/261/273/345/261/236/346/200/247/345/217/230/345/214/226/350/247/202/346/265/213.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Once/350/243/205/351/245/260/345/231/250/357/274/232/345/210/235/345/247/213/345/214/226/345/220/214/346/255/245/344/270/200/346/254/241.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Param/350/243/205/351/245/260/345/231/250/357/274/232/347/273/204/344/273/266/345/244/226/351/203/250/350/276/223/345/205/245.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Provider/350/243/205/351/245/260/345/231/250/345/222/214@Consumer/350/243/205/351/245/260/345/231/250/357/274/232/350/267/250/347/273/204/344/273/266/345/261/202/347/272/247/345/217/214/345/220/221/345/220/214/346/255/245.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/@Type/350/243/205/351/245/260/345/231/250/357/274/232/346/240/207/350/256/260/347/261/273/345/261/236/346/200/247/347/232/204/347/261/273/345/236/213.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/AppStorageV2/357/274/232/345/272/224/347/224/250/345/205/250/345/261/200UI/347/212/266/346/200/201/345/255/230/345/202/250.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/MVVM/346/250/241/345/274/217/357/274/210V2/357/274/211.md" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2/PersistenceV2/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" +0 -0
- /package/skills/{hmos-batch-ui-align → a2h-ui-transfer}/references/mvvm-v2//347/212/266/346/200/201/347/256/241/347/220/206V1/345/220/221V2/350/277/201/347/247/273/344/270/216/346/267/267/347/224/250/346/214/207/345/257/274.md" +0 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# V2 状态管理装饰器速查(选型 + 最小语法)
|
|
2
|
+
|
|
3
|
+
> **用途**:Phase 2.1 判定为 V2 时**只读本文件**即可开始转换。本文件覆盖全部 V2 装饰器的
|
|
4
|
+
> **选型判据 + 最小可用语法**。仅当遇到本文件未覆盖的边界情形(见每节「深读」指引)时,
|
|
5
|
+
> 才去读同目录下对应的完整文档。
|
|
6
|
+
>
|
|
7
|
+
> **铁律**:V1 与 V2 不在同一工程混用。本文件内的装饰器可自由组合,
|
|
8
|
+
> 但不得与 `@Component`/`@State`/`@Prop`/`@Link`/`@Provide`/`@Consume`/`@Observed`/`@ObjectLink`/`@Watch`/`@Track` 同时出现。
|
|
9
|
+
|
|
10
|
+
## 一、选型决策表(按需求查,命中即用)
|
|
11
|
+
|
|
12
|
+
| 需求 | 用什么 | 深读 |
|
|
13
|
+
|---|---|---|
|
|
14
|
+
| 声明一个 UI 组件 | `@ComponentV2` + `struct`(V2 组件**必须**用它,不能用 `@Component`) | `MVVM模式(V2).md` |
|
|
15
|
+
| 组件**自己**持有的可变状态 | `@Local` | `@Local装饰器:组件内部状态.md` |
|
|
16
|
+
| 从父组件**传入**的值(单向) | `@Param`(**只读**,不可在子组件内赋值) | `@Param装饰器:组件外部输入.md` |
|
|
17
|
+
| 传入值只在**首次**同步,之后子组件可自行改 | `@Param` + `@Once` 同时标注 | `@Once装饰器:初始化同步一次.md` |
|
|
18
|
+
| 子组件要**通知父组件**(回调) | `@Event`(声明为函数类型属性) | `@Event装饰器:规范组件输出.md` |
|
|
19
|
+
| 父子**双向绑定**一个值 | 父 `@Local` + 子 `@Param`/`@Event`,父传参写 `value: this.x!!` | `!!语法:双向绑定.md` |
|
|
20
|
+
| **跨多层**祖先↔后代双向同步(中间层不参与) | 祖先 `@Provider()` + 后代 `@Consumer()` | `@Provider装饰器和@Consumer装饰器:跨组件层级双向同步.md` |
|
|
21
|
+
| **自定义类**的属性变化要驱动 UI 刷新 | 类上 `@ObservedV2` + 需观测属性上 `@Trace` | `@ObservedV2装饰器和@Trace装饰器:类属性变化观测.md` |
|
|
22
|
+
| 某状态变化时执行**副作用**(拉数据、打日志) | `@Monitor('路径')` 方法 | `@Monitor装饰器:状态变量修改异步监听.md` |
|
|
23
|
+
| 由其他状态**推导**出的只读值(避免手工同步) | `@Computed` getter | `@Computed装饰器:计算属性.md` |
|
|
24
|
+
| 类属性是 `Date`/`Map`/`Set`/`Array` 等需明确类型 | `@Type` | `@Type装饰器:标记类属性的类型.md` |
|
|
25
|
+
| 跨页面共享、**不需要**落盘的全局状态 | `AppStorageV2.connect()` | `AppStorageV2:应用全局UI状态存储.md` |
|
|
26
|
+
| 跨页面共享、**需要**落盘持久化(设置项等) | `PersistenceV2.connect()` | `PersistenceV2:持久化存储UI状态.md` |
|
|
27
|
+
| 要在**既有 V1 工程**里局部扩展 | 见迁移文档,勿混用 | `状态管理V1向V2迁移与混用指导.md` |
|
|
28
|
+
|
|
29
|
+
## 二、最小语法
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// 1) 组件 + 内部状态 + 外部输入 + 事件输出
|
|
33
|
+
@ComponentV2
|
|
34
|
+
struct ChildView {
|
|
35
|
+
@Param readonlyTitle: string = ''; // 父传入,子内部只读
|
|
36
|
+
@Param @Once initialCount: number = 0; // 仅首次同步,之后可自行改
|
|
37
|
+
@Local count: number = 0; // 组件内部状态
|
|
38
|
+
@Event onCountChange: (v: number) => void = () => {}; // 子 → 父
|
|
39
|
+
|
|
40
|
+
build() {
|
|
41
|
+
Text(`${this.readonlyTitle}: ${this.count}`)
|
|
42
|
+
.onClick(() => { this.count++; this.onCountChange(this.count); })
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
// 2) 父组件:双向绑定用 !!
|
|
49
|
+
@ComponentV2
|
|
50
|
+
struct ParentView {
|
|
51
|
+
@Local count: number = 0;
|
|
52
|
+
build() {
|
|
53
|
+
// !! 等价于同时传 count 和 $count(自动生成 onCountChange 回写)
|
|
54
|
+
ChildView({ initialCount: this.count!! })
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
// 3) 可观测数据类:@ObservedV2 + @Trace(未加 @Trace 的属性改动不刷新 UI)
|
|
61
|
+
@ObservedV2
|
|
62
|
+
class ItemModel {
|
|
63
|
+
@Trace title: string = ''; // 改动会刷新 UI
|
|
64
|
+
@Trace count: number = 0;
|
|
65
|
+
@Trace tags: string[] = []; // 数组整体替换/元素增删均可观测
|
|
66
|
+
@Type(Date) @Trace updatedAt: Date = new Date();
|
|
67
|
+
cacheKey: string = ''; // 无 @Trace:改动不刷新 UI(有意为之)
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
// 4) ViewModel:@Computed 推导 + @Monitor 副作用
|
|
73
|
+
@ObservedV2
|
|
74
|
+
class PageViewModel {
|
|
75
|
+
@Trace model: ItemModel = new ItemModel();
|
|
76
|
+
@Trace loading: boolean = false;
|
|
77
|
+
|
|
78
|
+
@Computed
|
|
79
|
+
get displayLabel(): string { return `${this.model.title} (${this.model.count})`; }
|
|
80
|
+
|
|
81
|
+
@Monitor('model.count')
|
|
82
|
+
onCountChanged(mon: IMonitor): void {
|
|
83
|
+
mon.dirty.forEach((path: string) => { console.info(`changed: ${path}`); });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
// 5) 跨层级双向同步(中间组件无需转发)
|
|
90
|
+
@ComponentV2
|
|
91
|
+
struct AncestorView {
|
|
92
|
+
@Provider() theme: string = 'dark';
|
|
93
|
+
build() { MiddleView() }
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@ComponentV2
|
|
97
|
+
struct DeepChildView {
|
|
98
|
+
@Consumer() theme: string = 'light'; // 自动向上找同名 @Provider
|
|
99
|
+
build() { Text(this.theme).onClick(() => { this.theme = 'light'; }) } // 可回写
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
// 6) 全局 / 持久化状态
|
|
105
|
+
@ObservedV2
|
|
106
|
+
class SettingsStore {
|
|
107
|
+
static readonly KEY: string = 'SettingsStore';
|
|
108
|
+
@Trace useCelsius: boolean = true;
|
|
109
|
+
}
|
|
110
|
+
// 落盘(设置项、用户偏好):
|
|
111
|
+
const store: SettingsStore = PersistenceV2.connect(SettingsStore, SettingsStore.KEY, () => new SettingsStore())!;
|
|
112
|
+
// 仅内存、跨页面共享:
|
|
113
|
+
const session: SettingsStore = AppStorageV2.connect(SettingsStore, 'session', () => new SettingsStore())!;
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 三、高频错误(本表即验收清单)
|
|
117
|
+
|
|
118
|
+
| 错误 | 后果 | 正确做法 |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| 在子组件内给 `@Param` 赋值 | 编译报错 | 需可改 → 加 `@Once`;需回写父 → `@Event` 或 `!!` |
|
|
121
|
+
| 类属性只加 `@ObservedV2`、漏 `@Trace` | 数据变了 **UI 不刷新**(无报错,最难查) | 所有参与渲染的属性都要 `@Trace` |
|
|
122
|
+
| 用 `@Local` 接收父组件传入值 | 父更新后子不同步 | 改用 `@Param` |
|
|
123
|
+
| `@Computed` getter 里写副作用/赋值 | 行为未定义 | getter 保持纯函数;副作用放 `@Monitor` |
|
|
124
|
+
| `@Monitor` 写在 `struct` 里监听非状态变量 | 不触发 | 只监听 `@Local`/`@Param`/`@Trace` 路径 |
|
|
125
|
+
| `PersistenceV2.connect` 的类未加 `@ObservedV2` | 不持久化/不刷新 | 存储类必须 `@ObservedV2` + `@Trace` |
|
|
126
|
+
| `@ComponentV2` 里出现 `@State`/`@Link` 等 V1 装饰器 | 编译报错或行为异常 | 全程单一范式,见开头铁律 |
|
|
127
|
+
| **(V1)`@Observed` 类里用了 `@Track`,却让 UI 读到未被 `@Track` 的成员** | **首帧运行时崩溃**:`BusinessError 140110: Illegal usage of not @Track'ed property 'x' on UI!` | `@Track` 是 **all-or-nothing**:类里一旦出现任何 `@Track`,UI 读到的每一个成员都必须是 `@Track` 字段(依据 `../mvvm/@Track装饰器:class对象属性级更新.md:15`、`:198`) |
|
|
128
|
+
| **(V1)用 `get x()` 给 UI 暴露派生值** | 同上,首帧崩溃。**编译通过、零告警、字段侧完备性检查全过** —— getter 不是数据属性,无法被 `@Track` 装饰 | **V1 没有 `@Computed`**(那是 V2 能力)。派生值改成**普通方法**(`title(): string`,UI 侧 `vm.title()`;原型方法不经过 `@Track` 代理),或提升为真正的 `@Track` 字段。注意「getter 会重新求值」只说明**响应性**没问题,**不说明合法性** |
|
|
129
|
+
|
|
130
|
+
> **V1 专有陷阱,务必读完上面两行。** V2 的派生值有 `@Computed` 这条正路,V1 没有,
|
|
131
|
+
> 于是「用裸 getter 暴露派生值」成了 V1 侧极自然却必崩的写法。上面两行是该缺陷的完整判据;
|
|
132
|
+
> 需要完整约束与官方示例时读 `../mvvm/@Track装饰器:class对象属性级更新.md`。
|
|
133
|
+
> 机械兜底:`scripts/arkts_static_check.js` 的 GATE 规则 `track-class-getter-in-ui`。
|