android2harmony 0.1.4 → 0.1.5
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 +376 -376
- package/dist/index.js +134 -116
- package/dist/index.js.map +3 -3
- package/package.json +36 -32
- package/skills/a2h-resource-convert/SKILL.md +902 -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 +2166 -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 +420 -0
- package/skills/a2h-ui-transfer/references/conversion-procedure.md +572 -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} +397 -283
- 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-incremental-ui-align/README.md +251 -251
- package/skills/hmos-incremental-ui-align/SKILL.md +364 -364
- 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-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`。
|