@feng3d/reactivity 1.0.5 → 1.0.7

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.
Files changed (97) hide show
  1. package/dist/assets/RobotoMono-Medium-DVgDz_OO.woff2 +0 -0
  2. package/dist/assets/RobotoMono-Regular-BPoF81uy.woff2 +0 -0
  3. package/dist/assets/index-a2qCSG5V.css +629 -0
  4. package/dist/assets/index.html-Dyp3udP2.js +200 -0
  5. package/dist/assets/modulepreload-polyfill-DaKOjhqt.js +37 -0
  6. package/dist/assets/package-DuJynByc.js +2539 -0
  7. package/dist/assets/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html-C3hbV3IR.js +59 -0
  8. package/dist/assets/src//346/225/260/347/273/204/index.html-CHK6WEhd.js +43 -0
  9. package/dist/docs/.nojekyll +1 -0
  10. package/dist/docs/assets/hierarchy.js +1 -0
  11. package/dist/docs/assets/highlight.css +92 -0
  12. package/dist/docs/assets/icons.js +18 -0
  13. package/dist/docs/assets/icons.svg +1 -0
  14. package/dist/docs/assets/main.js +60 -0
  15. package/dist/docs/assets/navigation.js +1 -0
  16. package/dist/docs/assets/search.js +1 -0
  17. package/dist/docs/assets/style.css +1640 -0
  18. package/dist/docs/classes/EffectScope.html +40 -0
  19. package/dist/docs/functions/batchRun.html +15 -0
  20. package/dist/docs/functions/computed.html +5 -0
  21. package/dist/docs/functions/effect.html +11 -0
  22. package/dist/docs/functions/effectScope.html +5 -0
  23. package/dist/docs/functions/forceTrack.html +6 -0
  24. package/dist/docs/functions/getCurrentScope.html +4 -0
  25. package/dist/docs/functions/isProxy.html +5 -0
  26. package/dist/docs/functions/isReactive.html +5 -0
  27. package/dist/docs/functions/isRef.html +5 -0
  28. package/dist/docs/functions/noTrack.html +6 -0
  29. package/dist/docs/functions/onScopeDispose.html +6 -0
  30. package/dist/docs/functions/reactive.html +19 -0
  31. package/dist/docs/functions/ref.html +13 -0
  32. package/dist/docs/functions/toRaw.html +4 -0
  33. package/dist/docs/hierarchy.html +1 -0
  34. package/dist/docs/index.html +129 -0
  35. package/dist/docs/interfaces/Computed.html +9 -0
  36. package/dist/docs/interfaces/Effect.html +8 -0
  37. package/dist/docs/interfaces/Ref.html +9 -0
  38. package/dist/docs/modules.html +1 -0
  39. package/dist/docs/types/Reactive.html +3 -0
  40. package/dist/docs/types/UnReadonly.html +3 -0
  41. package/dist/files/RobotoMono-Medium.woff2 +0 -0
  42. package/dist/files/RobotoMono-Regular.woff2 +0 -0
  43. package/dist/files/ic_code_black_24dp.svg +4 -0
  44. package/dist/files/ic_search_black_24dp.svg +4 -0
  45. package/dist/files/main.css +629 -0
  46. package/dist/files/thumbnails.svg +7 -0
  47. package/dist/files.json +7 -0
  48. package/dist/index.html +84 -0
  49. package/dist/index.js +733 -157
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.umd.cjs +733 -157
  52. package/dist/index.umd.cjs.map +1 -1
  53. package/dist/screenshots//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274.jpg +0 -0
  54. package/dist/screenshots//346/225/260/347/273/204.jpg +0 -0
  55. package/dist/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html +70 -0
  56. package/dist/src//346/225/260/347/273/204/index.html +65 -0
  57. package/dist/tags.json +2 -0
  58. package/lib/Reactivity.d.ts +47 -13
  59. package/lib/Reactivity.d.ts.map +1 -1
  60. package/lib/arrayInstrumentations.d.ts +10 -0
  61. package/lib/arrayInstrumentations.d.ts.map +1 -1
  62. package/lib/baseHandlers.d.ts +3 -1
  63. package/lib/baseHandlers.d.ts.map +1 -1
  64. package/lib/batch.d.ts +17 -5
  65. package/lib/batch.d.ts.map +1 -1
  66. package/lib/collectionHandlers.d.ts +21 -0
  67. package/lib/collectionHandlers.d.ts.map +1 -1
  68. package/lib/computed.d.ts +75 -27
  69. package/lib/computed.d.ts.map +1 -1
  70. package/lib/effect.d.ts +25 -0
  71. package/lib/effect.d.ts.map +1 -1
  72. package/lib/effectScope.d.ts +129 -0
  73. package/lib/effectScope.d.ts.map +1 -0
  74. package/lib/index.d.ts +6 -5
  75. package/lib/index.d.ts.map +1 -1
  76. package/lib/property.d.ts.map +1 -1
  77. package/lib/reactive.d.ts +58 -17
  78. package/lib/reactive.d.ts.map +1 -1
  79. package/lib/ref.d.ts +66 -4
  80. package/lib/ref.d.ts.map +1 -1
  81. package/lib/shared/constants.d.ts +7 -7
  82. package/lib/shared/constants.d.ts.map +1 -1
  83. package/lib/shared/general.d.ts +1 -1
  84. package/lib/shared/general.d.ts.map +1 -1
  85. package/package.json +19 -17
  86. package/src/Reactivity.ts +57 -15
  87. package/src/arrayInstrumentations.ts +406 -53
  88. package/src/baseHandlers.ts +124 -32
  89. package/src/batch.ts +38 -11
  90. package/src/collectionHandlers.ts +207 -19
  91. package/src/computed.ts +92 -43
  92. package/src/effect.ts +38 -0
  93. package/src/effectScope.ts +294 -0
  94. package/src/index.ts +6 -5
  95. package/src/property.ts +6 -0
  96. package/src/reactive.ts +67 -20
  97. package/src/ref.ts +66 -4
package/lib/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { batchRun } from './batch';
2
- export { ComputedReactivity as ComputedDep, computed, type Computed } from './computed';
3
- export { Reactivity as Dep, forceTrack, noTrack } from './Reactivity';
4
- export { EffectReactivity as EffectDep, effect, type Effect } from './effect';
5
- export { isProxy, isReactive, reactive, type Reactive } from './reactive';
6
- export { RefReactivity, isRef, ref, type Ref } from './ref';
2
+ export { computed, type Computed } from './computed';
3
+ export { effect, type Effect } from './effect';
4
+ export { effectScope, EffectScope, getCurrentScope, onScopeDispose } from './effectScope';
5
+ export { isProxy, isReactive, reactive, type Reactive, type UnReadonly } from './reactive';
6
+ export { forceTrack, noTrack } from './Reactivity';
7
+ export { isRef, ref, type Ref } from './ref';
7
8
  export { toRaw } from './shared/general';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,kBAAkB,IAAI,WAAW,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,UAAU,IAAI,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,gBAAgB,IAAI,SAAS,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAuD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AA8BvH;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,IAAI,KAAK,IAAI,CAAC,CAKb;IACD,IAAI,KAAK,CAAC,CAAC,EANE,CAMF,EAeV;IAED,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;gBAEJ,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAuB7B,gBAAgB;IAKhB;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IASpE;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAiB;IAExF;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;CA+FpH"}
1
+ {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAuD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAgCvH;;GAEG;AACH,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,IAAI,KAAK,IAAI,CAAC,CAKb;IAED,IAAI,KAAK,CAAC,CAAC,EAPE,CAOF,EAeV;IAED,OAAO,CAAC,OAAO,CAAI;IACnB,OAAO,CAAC,IAAI,CAAI;gBAEJ,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IAuB7B,gBAAgB;IAKhB;;;;;;;;OAQG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IAUpE;;OAEG;IACH,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAiB;IAExF;;;;;;;;;OASG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI;CAiGpH"}
package/lib/reactive.d.ts CHANGED
@@ -3,58 +3,92 @@ import { Ref } from './ref';
3
3
  import { Target } from './shared/general';
4
4
  /**
5
5
  * 移除对象属性中的 readonly 关键字。
6
+ *
7
+ * 用于将只读类型转换为可写类型。
6
8
  */
7
- type UnReadonly<T> = {
9
+ export type UnReadonly<T> = {
8
10
  -readonly [P in keyof T]: T[P];
9
11
  };
10
12
  /**
11
13
  * 创建或者获取响应式对象的代理对象。
12
14
  *
13
- * @param target 被响应式的对象。
14
- * @returns 响应式代理对象。
15
+ * 将普通对象转换为响应式对象,使其属性可以被追踪和更新。
16
+ *
17
+ * 特点:
18
+ * 1. 支持对象和集合类型的响应式转换
19
+ * 2. 自动处理嵌套对象的响应式转换
20
+ * 3. 缓存已创建的代理对象
21
+ * 4. 支持只读属性的响应式转换
15
22
  *
16
23
  * 注意:
24
+ * 1. 扩大被反应式的对象的类型范围,只有 `Object.isExtensible` 不通过的对象不被响应化。
25
+ * Float32Array 等都允许被响应化。
26
+ * 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,
27
+ * 通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。
17
28
  *
18
- * 1. 扩大被反应式的对象的类型范围,只有`Object.isExtensible`不通过的对象不被响应化。Float32Array等都允许被响应化。
19
- * 2. 被反应式的对象的只读属性也会被标记为可编辑。希望被反应对象属性一般为只读属性,通过反应式来改变属性值,同时又通过反应式系统来处理其更改后响应逻辑。
29
+ * @param target 要转换为响应式的对象
30
+ * @returns 响应式代理对象
31
+ */
32
+ export declare function reactive<T extends object>(target: T): Reactive<T>;
33
+ /**
34
+ * 响应式对象缓存映射。
20
35
  *
36
+ * 用于缓存已创建的响应式代理对象,避免重复创建。
21
37
  */
22
- export declare function reactive<T extends object>(target: T): UnReadonly<Reactive<T>>;
23
38
  export declare const reactiveMap: WeakMap<Target, any>;
24
39
  /**
25
40
  * 判断一个对象是否为响应式对象。
26
41
  *
27
- * @param value 对象。
28
- * @returns
42
+ * 通过检查对象是否具有 IS_REACTIVE 标志来判断。
43
+ *
44
+ * @param value 要检查的对象
45
+ * @returns 如果是响应式对象则返回 true,否则返回 false
29
46
  */
30
47
  export declare function isReactive(value: unknown): boolean;
31
48
  /**
32
49
  * 转换为响应式对象。
33
50
  *
34
- * @param value 对象。
35
- * @returns
51
+ * 如果输入是对象,则将其转换为响应式对象。
52
+ * 如果输入不是对象,则直接返回。
53
+ *
54
+ * @param value 要转换的值
55
+ * @returns 转换后的响应式对象或原值
36
56
  */
37
57
  export declare const toReactive: <T>(value: T) => T;
38
58
  /**
39
59
  * 判断一个对象是否为代理对象。
40
60
  *
41
- * @param value 对象。
42
- * @returns
61
+ * 通过检查对象是否具有 RAW 标志来判断。
62
+ *
63
+ * @param value 要检查的对象
64
+ * @returns 如果是代理对象则返回 true,否则返回 false
43
65
  */
44
66
  export declare function isProxy(value: any): boolean;
45
- export type Reactive<T> = UnwrapRefSimple<T>;
46
67
  /**
47
- * 原始类型
68
+ * 响应式类型。
69
+ *
70
+ * 表示一个对象的所有属性都是响应式的。
71
+ */
72
+ export type Reactive<T> = UnReadonly<UnwrapRefSimple<T>>;
73
+ /**
74
+ * 原始类型。
75
+ *
76
+ * 包括:字符串、数字、布尔值、大整数、符号、undefined、null。
48
77
  */
49
78
  type Primitive = string | number | boolean | bigint | symbol | undefined | null;
50
79
  /**
51
- * 内置类型
80
+ * 内置类型。
81
+ *
82
+ * 包括:原始类型、函数、日期、错误、正则表达式。
52
83
  */
53
84
  export type Builtin = Primitive | Function | Date | Error | RegExp;
54
85
  /**
55
- * 用于扩展不被 unwrap 的类型。
86
+ * 用于扩展不被解包的类型。
87
+ *
88
+ * 可以通过声明合并来扩展此接口,添加不需要被解包的类型。
56
89
  *
57
- * ``` ts
90
+ * 示例:
91
+ * ```ts
58
92
  * declare module '@vue/reactivity' {
59
93
  * export interface RefUnwrapBailTypes {
60
94
  * runtimeDOMBailTypes: Node | Window
@@ -66,6 +100,13 @@ export interface RefUnwrapBailTypes {
66
100
  }
67
101
  /**
68
102
  * 解包类型。
103
+ *
104
+ * 递归地解包响应式对象的类型,包括:
105
+ * 1. 内置类型直接返回
106
+ * 2. Ref 类型解包为内部类型
107
+ * 3. Computed 类型解包为内部类型
108
+ * 4. 对象类型递归解包其属性
109
+ * 5. 其他类型直接返回
69
110
  */
70
111
  export type UnwrapRefSimple<T> = T extends Builtin | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] ? T : T extends Ref<infer TT> ? TT : T extends Computed<infer TT> ? TT : T extends object ? {
71
112
  [K in keyof T]: UnwrapRefSimple<T[K]>;
@@ -1 +1 @@
1
- {"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAA2B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;GAEG;AACH,KAAK,UAAU,CAAC,CAAC,IAAI;IACjB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAiC7E;AACD,eAAO,MAAM,WAAW,sBAA6B,CAAC;AAEtD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGlD;AAED;;;;;GAKG;AACH,eAAO,MAAM,UAAU,oBAQtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAG3C;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC;AAE7C;;GAEG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAChF;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;CAAI;AAEvC;;GAEG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB,CAAC,SACC,OAAO,GACP,GAAG,GACH,kBAAkB,CAAC,MAAM,kBAAkB,CAAC,GAC5C,CAAC,GACH,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAC5B,CAAC,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GACjC,CAAC,SAAS,MAAM,GAAG;KACd,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,GACD,CAAC,CAAC"}
1
+ {"version":3,"file":"reactive.d.ts","sourceRoot":"","sources":["../src/reactive.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAA2B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IACxB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAqCjE;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,sBAA6B,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGlD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,CAQxC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,CAG3C;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzD;;;;GAIG;AACH,KAAK,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAEhF;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;AAEnE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,kBAAkB;CAAI;AAEvC;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IACzB,CAAC,SACC,OAAO,GACP,GAAG,GACH,kBAAkB,CAAC,MAAM,kBAAkB,CAAC,GAC5C,CAAC,GACH,CAAC,SAAS,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GAC5B,CAAC,SAAS,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,GACjC,CAAC,SAAS,MAAM,GAAG;KACd,CAAC,IAAI,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACxC,GACD,CAAC,CAAC"}
package/lib/ref.d.ts CHANGED
@@ -3,34 +3,96 @@ import { ReactiveFlags } from './shared/constants';
3
3
  /**
4
4
  * 创建一个引用,该引用的值可以被响应式系统追踪和更新。
5
5
  *
6
- * @param value 引用的值。
7
- * @returns 包含 value 属性的对象,用于获取和设置引用的值。
6
+ * ref 是响应式系统中最基本的响应式对象。
7
+ * 它可以包装任何类型的值,使其成为响应式的。
8
+ *
9
+ * 特点:
10
+ * 1. 可以包装任何类型的值
11
+ * 2. 通过 .value 访问和修改值
12
+ * 3. 自动解包原始值
13
+ * 4. 支持嵌套的响应式对象
14
+ *
15
+ * @param value 要包装的值
16
+ * @returns 包含 value 属性的响应式引用对象
8
17
  */
9
18
  export declare function ref<T>(value?: T): Ref<T>;
10
19
  /**
11
20
  * 判断一个对象是否为引用。
12
- * @param r 引用。
21
+ *
22
+ * 通过检查对象是否具有 IS_REF 标志来判断。
23
+ *
24
+ * @param r 要检查的对象
25
+ * @returns 如果是引用则返回 true,否则返回 false
13
26
  */
14
27
  export declare function isRef<T>(r: Ref<T> | unknown): r is Ref<T>;
28
+ /**
29
+ * 引用反应式节点接口。
30
+ *
31
+ * 继承自 Ref 接口,表示这是一个引用反应式节点。
32
+ */
15
33
  export interface RefReactivity<T = any> extends Ref<T> {
16
34
  }
17
35
  /**
18
- * 引用反应式节点。
36
+ * 引用反应式节点类。
19
37
  *
20
38
  * 当使用 ref 函数时,会创建一个 RefReactivity 对象。
39
+ * 实现了引用的核心功能:
40
+ * 1. 值的存储和访问
41
+ * 2. 值的自动解包
42
+ * 3. 变更通知
43
+ * 4. 依赖追踪
21
44
  */
22
45
  export declare class RefReactivity<T = any> extends Reactivity<T> implements Ref<T> {
46
+ /**
47
+ * 标识这是一个 ref 对象。
48
+ *
49
+ * 用于 isRef 函数判断对象是否为引用。
50
+ */
23
51
  readonly [ReactiveFlags.IS_REF] = true;
52
+ /**
53
+ * 获取引用的值。
54
+ *
55
+ * 取值时会:
56
+ * 1. 建立依赖关系
57
+ * 2. 返回当前值
58
+ */
24
59
  get value(): T;
60
+ /**
61
+ * 设置引用的值。
62
+ *
63
+ * 设置值时会:
64
+ * 1. 比较新旧值是否发生变化
65
+ * 2. 如果值发生变化,则:
66
+ * - 触发更新通知
67
+ * - 更新原始值
68
+ * - 更新响应式值
69
+ *
70
+ * @param v 要设置的新值
71
+ */
25
72
  set value(v: T);
26
73
  /**
27
74
  * 原始值。
28
75
  *
76
+ * 存储未经响应式处理的原始值。
29
77
  * 用于比较值是否发生变化。
78
+ *
79
+ * @private
30
80
  */
31
81
  private _rawValue;
82
+ /**
83
+ * 创建引用反应式节点。
84
+ *
85
+ * @param value 要包装的值
86
+ */
32
87
  constructor(value: T);
33
88
  }
89
+ /**
90
+ * 引用接口。
91
+ *
92
+ * 定义了引用的基本结构:
93
+ * 1. value: 引用的值,可读可写
94
+ * 2. RefSymbol: 用于标识这是一个引用
95
+ */
34
96
  export interface Ref<T = any, S = T> {
35
97
  get value(): T;
36
98
  set value(_: S);
package/lib/ref.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAQxC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AAM3D,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;CAAI;AAE1D;;;;GAIG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,GAAG,CAAC,CAAC,CAAC;IAEvE,SAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ;IAE9C,IAAI,KAAK,IAOI,CAAC,CAFb;IAED,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAcb;IAED;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAI;gBAET,KAAK,EAAE,CAAC;CAMvB;AAED,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IAE/B,IAAI,KAAK,IAAI,CAAC,CAAA;IACd,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAC;IACf,CAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CACpB;AACD,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC"}
1
+ {"version":3,"file":"ref.d.ts","sourceRoot":"","sources":["../src/ref.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAQxC;AAED;;;;;;;GAOG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AAM3D;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,GAAG,CAAC,CAAC,CAAC;CAAI;AAE1D;;;;;;;;;GASG;AACH,qBAAa,aAAa,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAE,YAAW,GAAG,CAAC,CAAC,CAAC;IAEvE;;;;OAIG;IACH,SAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ;IAE9C;;;;;;OAMG;IACH,IAAI,KAAK,IAmBI,CAAC,CAdb;IAED;;;;;;;;;;;OAWG;IACH,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAcb;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS,CAAI;IAErB;;;;OAIG;gBACS,KAAK,EAAE,CAAC;CAMvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;IAE/B,IAAI,KAAK,IAAI,CAAC,CAAA;IACd,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAC;IACf,CAAC,SAAS,CAAC,EAAE,IAAI,CAAA;CACpB;AACD,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC"}
@@ -2,8 +2,8 @@
2
2
  * 响应式标志枚举,用于标识响应式对象的特殊属性或状态
3
3
  */
4
4
  export declare enum ReactiveFlags {
5
- IS_REACTIVE = "__v_isReactive",
6
- RAW = "__v_raw",
5
+ IS_REACTIVE = "__v_isReactive",// 标识对象是否为响应式对象
6
+ RAW = "__v_raw",// 获取对象的原始非响应式版本
7
7
  IS_REF = "__v_isRef"
8
8
  }
9
9
  export declare enum TargetType {
@@ -15,17 +15,17 @@ export declare enum TargetType {
15
15
  * 跟踪操作类型枚举,用于标识在响应式系统中对对象属性进行的操作类型
16
16
  */
17
17
  export declare enum TrackOpTypes {
18
- GET = "get",
19
- HAS = "has",
18
+ GET = "get",// 获取属性值
19
+ HAS = "has",// 检查属性是否存在
20
20
  ITERATE = "iterate"
21
21
  }
22
22
  /**
23
23
  * 触发操作类型枚举,用于标识在响应式系统中对对象属性进行的修改操作类型
24
24
  */
25
25
  export declare enum TriggerOpTypes {
26
- SET = "set",
27
- ADD = "add",
28
- DELETE = "delete",
26
+ SET = "set",// 设置属性值
27
+ ADD = "add",// 添加新属性
28
+ DELETE = "delete",// 删除属性
29
29
  CLEAR = "clear"
30
30
  }
31
31
  export declare const ITERATE_KEY: unique symbol;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IAErB,WAAW,mBAAmB;IAC9B,GAAG,YAAY;IACf,MAAM,cAAc;CACvB;AAED,oBAAY,UAAU;IAElB,OAAO,IAAI;IACX,MAAM,IAAI;IACV,UAAU,IAAI;CACjB;AAED;;GAEG;AACH,oBAAY,YAAY;IAEpB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,oBAAY,cAAc;IAEtB,GAAG,QAAQ;IACX,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,KAAK,UAAU;CAClB;AAED,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAC;AAClF,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAkD,CAAC;AAC5F,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAA+C,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/shared/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,aAAa;IAErB,WAAW,mBAAmB,CAAE,eAAe;IAC/C,GAAG,YAAY,CAAE,gBAAgB;IACjC,MAAM,cAAc;CACvB;AAED,oBAAY,UAAU;IAElB,OAAO,IAAI;IACX,MAAM,IAAI;IACV,UAAU,IAAI;CACjB;AAED;;GAEG;AACH,oBAAY,YAAY;IAEpB,GAAG,QAAQ,CAAE,QAAQ;IACrB,GAAG,QAAQ,CAAE,WAAW;IACxB,OAAO,YAAY;CACtB;AAED;;GAEG;AACH,oBAAY,cAAc;IAEtB,GAAG,QAAQ,CAAE,QAAQ;IACrB,GAAG,QAAQ,CAAE,QAAQ;IACrB,MAAM,WAAW,CAAE,OAAO;IAC1B,KAAK,UAAU;CAClB;AAED,eAAO,MAAM,WAAW,EAAE,OAAO,MAAgD,CAAC;AAClF,eAAO,MAAM,mBAAmB,EAAE,OAAO,MAAkD,CAAC;AAC5F,eAAO,MAAM,iBAAiB,EAAE,OAAO,MAA+C,CAAC"}
@@ -12,7 +12,7 @@ export declare const isSymbol: (val: unknown) => val is symbol;
12
12
  export declare const isString: (val: unknown) => val is string;
13
13
  export declare const isIntegerKey: (key: unknown) => boolean;
14
14
  export declare const isMap: (val: unknown) => val is Map<any, any>;
15
- export declare const hasOwn: (val: object, key: string | symbol) => key is never;
15
+ export declare const hasOwn: (val: object, key: string | symbol) => key is keyof typeof val;
16
16
  export declare const hasChanged: (value: any, oldValue: any) => boolean;
17
17
  export declare function getTargetType(value: Target): TargetType;
18
18
  export declare const toRawType: (value: unknown) => string;
@@ -1 +1 @@
1
- {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../src/shared/general.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAG,CAAC;AACX,OAAO,CAAC,MAAM,CACd;IACI;;OAEG;IACH,IAAI,OAAO,EAAE,OAAO,CAAC;CACxB;AAGD,eAAO,MAAM,QAAQ,QAAS,OAAO,4BAAqE,CAAC;AAE3G,eAAO,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC,OAAuB,CAAC;AAC3D,eAAO,MAAM,QAAQ,QAAS,OAAO,kBAA2C,CAAC;AACjF,eAAO,MAAM,QAAQ,QAAS,OAAO,kBAA2C,CAAC;AACjF,eAAO,MAAM,YAAY,QAAS,OAAO,KAAG,OAIA,CAAC;AAC7C,eAAO,MAAM,KAAK,QAAS,OAAO,yBACM,CAAC;AAGzC,eAAO,MAAM,MAAM,QACV,MAAM,OACN,MAAM,GAAG,MAAM,iBACoD,CAAC;AAG7E,eAAO,MAAM,UAAU,UAAW,GAAG,YAAY,GAAG,KAAG,OACxB,CAAC;AAmBhC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,cAK1C;AAKD,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,MAGP,CAAC;AAErC,MAAM,WAAW,MAAM;IAEnB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAA;IACrC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAA;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAKvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAGtD;AAED;;;;GAIG;AAGH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAU7D"}
1
+ {"version":3,"file":"general.d.ts","sourceRoot":"","sources":["../../src/shared/general.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAG,CAAC;AACX,OAAO,CAAC,MAAM,CACd;IACI;;OAEG;IACH,IAAI,OAAO,EAAE,OAAO,CAAC;CACxB;AAGD,eAAO,MAAM,QAAQ,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,CAA4C,CAAC;AAE3G,eAAO,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC,OAAuB,CAAC;AAC3D,eAAO,MAAM,QAAQ,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,MAAiC,CAAC;AACjF,eAAO,MAAM,QAAQ,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,MAAiC,CAAC;AACjF,eAAO,MAAM,YAAY,GAAI,KAAK,OAAO,KAAG,OAIA,CAAC;AAC7C,eAAO,MAAM,KAAK,GAAI,KAAK,OAAO,KAAG,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,CAChB,CAAC;AAGzC,eAAO,MAAM,MAAM,GACf,KAAK,MAAM,EACX,KAAK,MAAM,GAAG,MAAM,KACrB,GAAG,IAAI,MAAM,OAAO,GAAqD,CAAC;AAG7E,eAAO,MAAM,UAAU,GAAI,OAAO,GAAG,EAAE,UAAU,GAAG,KAAG,OACxB,CAAC;AAmBhC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,cAK1C;AAKD,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,MAGP,CAAC;AAErC,MAAM,WAAW,MAAM;IAEnB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,CAAA;IACrC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAA;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAKvC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAGtD;AAED;;;;GAIG;AAGH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAU7D"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@feng3d/reactivity",
3
3
  "type": "module",
4
- "version": "1.0.5",
5
- "description": "反应式",
4
+ "version": "1.0.7",
5
+ "description": "反应式,主要用于feng3d中的数据驱动。",
6
6
  "homepage": "https://feng3d.com/reactivity",
7
7
  "main": "./dist/index.umd.cjs",
8
8
  "types": "./lib/index.d.ts",
@@ -11,9 +11,9 @@
11
11
  "license": "MIT",
12
12
  "exports": {
13
13
  ".": {
14
+ "types": "./lib/index.d.ts",
14
15
  "import": "./dist/index.js",
15
- "require": "./dist/index.umd.cjs",
16
- "types": "./lib/index.d.ts"
16
+ "require": "./dist/index.umd.cjs"
17
17
  }
18
18
  },
19
19
  "scripts": {
@@ -21,10 +21,9 @@
21
21
  "clean": "rimraf \"{lib,dist,public}\"",
22
22
  "build": "vite build",
23
23
  "test": "vitest",
24
- "test:ui": "vitest --ui",
25
24
  "types": "tsc",
26
25
  "watch": "tsc -w",
27
- "lint": "eslint --ext .js --ext .ts src test --ignore-path .gitignore --max-warnings 0",
26
+ "lint": "eslint . --ext .js,.ts --max-warnings 0",
28
27
  "lintfix": "npm run lint -- --fix",
29
28
  "docs": "typedoc && cd examples && vite build --outDir ../public",
30
29
  "upload_oss": "npm run docs && feng3d-cli oss_upload_dir",
@@ -51,17 +50,20 @@
51
50
  "tsconfig.json"
52
51
  ],
53
52
  "devDependencies": {
53
+ "@eslint/js": "^9.0.0",
54
54
  "@feng3d/cli": "^0.0.19",
55
- "@typescript-eslint/eslint-plugin": "5.17.0",
56
- "@typescript-eslint/parser": "5.17.0",
57
- "@vitest/ui": "^0.32.2",
55
+ "@types/node": "^22.15.19",
56
+ "@typescript-eslint/eslint-plugin": "8.32.1",
57
+ "@typescript-eslint/parser": "8.32.1",
58
58
  "cross-env": "7.0.3",
59
- "eslint": "8.12.0",
60
- "rimraf": "3.0.2",
61
- "tslib": "^2.4.0",
62
- "typedoc": "^0.24.8",
63
- "typescript": "5.1.3",
64
- "vite": "^4.3.9",
65
- "vitest": "^0.32.2"
59
+ "eslint": "9.26.0",
60
+ "globals": "^14.0.0",
61
+ "rimraf": "6.0.1",
62
+ "tslib": "^2.8.1",
63
+ "typedoc": "^0.28.4",
64
+ "typescript": "5.8.3",
65
+ "typescript-eslint": "^8.32.1",
66
+ "vite": "^6.3.5",
67
+ "vitest": "^3.1.3"
66
68
  }
67
- }
69
+ }
package/src/Reactivity.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import { type ComputedReactivity } from './computed';
2
2
 
3
3
  /**
4
- * 反应式节点。
4
+ * 反应式节点基类。
5
5
  *
6
6
  * 拥有节点值以及被捕捉与触发的能力。
7
+ * 用于被 computed、effect 等构建的节点所继承。
7
8
  *
8
- * 用于被 computed effect 等构建的节点所继承。
9
+ * 实现了响应式系统的核心功能:
10
+ * 1. 值的存储和访问
11
+ * 2. 依赖关系的建立(track)
12
+ * 3. 变更通知的传播(trigger)
9
13
  */
10
14
  export class Reactivity<T = any>
11
15
  {
@@ -13,6 +17,7 @@ export class Reactivity<T = any>
13
17
  * 获取当前节点值。
14
18
  *
15
19
  * 取值时将会建立与父节点的依赖关系。
20
+ * 当其他响应式节点访问此值时,会自动建立依赖关系。
16
21
  */
17
22
  get value(): T
18
23
  {
@@ -20,26 +25,32 @@ export class Reactivity<T = any>
20
25
 
21
26
  return this._value;
22
27
  }
28
+
23
29
  /**
24
30
  * @private
25
31
  */
26
32
  _value: T;
27
33
 
28
34
  /**
29
- * 父反应节点。
35
+ * 父反应节点集合。
30
36
  *
31
- * 记录了哪些节点调用了当前节点。
37
+ * 记录了哪些节点依赖了当前节点。
38
+ * 当当前节点值发生变化时,会通知所有父节点。
32
39
  *
33
- * 当前节点失效时,会通知并移除所有父节点。
40
+ * Map 的 key 是父节点,value 是父节点的版本号。
41
+ * 版本号用于判断依赖关系是否过期。
34
42
  *
35
43
  * @private
36
44
  */
37
45
  _parents = new Map<ComputedReactivity, number>();
38
46
 
39
47
  /**
40
- * 捕捉。
48
+ * 建立依赖关系。
49
+ *
50
+ * 当其他节点访问当前节点的值时,会调用此方法。
51
+ * 将当前节点与访问者(父节点)建立依赖关系。
41
52
  *
42
- * 建立与父节点的依赖关系。
53
+ * 如果当前没有活动的响应式节点,或者不应该跟踪依赖,则不会建立依赖关系。
43
54
  */
44
55
  track()
45
56
  {
@@ -47,6 +58,7 @@ export class Reactivity<T = any>
47
58
 
48
59
  // 连接父节点和子节点。
49
60
  const parent = Reactivity.activeReactivity;
61
+
50
62
  if (parent)
51
63
  {
52
64
  this._parents.set(parent, parent._version);
@@ -54,9 +66,16 @@ export class Reactivity<T = any>
54
66
  }
55
67
 
56
68
  /**
57
- * 触发。
69
+ * 触发更新。
70
+ *
71
+ * 当节点值发生变化时,会调用此方法。
72
+ * 通知所有依赖此节点的父节点进行更新。
58
73
  *
59
- * 冒泡到所有父节点,设置失效子节点字典。
74
+ * 更新过程:
75
+ * 1. 遍历所有父节点
76
+ * 2. 检查父节点的版本号是否匹配
77
+ * 3. 触发父节点的更新
78
+ * 4. 将当前节点添加到父节点的失效子节点集合中
60
79
  */
61
80
  trigger()
62
81
  {
@@ -77,6 +96,9 @@ export class Reactivity<T = any>
77
96
  /**
78
97
  * 当前正在执行的反应式节点。
79
98
  *
99
+ * 用于在依赖收集过程中标识当前正在执行的节点。
100
+ * 当其他节点访问此节点的值时,会将其作为父节点。
101
+ *
80
102
  * @internal
81
103
  */
82
104
  static activeReactivity: ComputedReactivity;
@@ -84,42 +106,62 @@ export class Reactivity<T = any>
84
106
 
85
107
  /**
86
108
  * 反应式节点链。
109
+ *
110
+ * 用于表示响应式节点之间的依赖关系链。
111
+ * 每个节点包含:
112
+ * 1. 节点本身
113
+ * 2. 节点的值
114
+ * 3. 下一个节点的引用
87
115
  */
88
116
  export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
89
117
 
90
118
  /**
91
- * 强制跟踪。
119
+ * 强制跟踪依赖。
120
+ *
121
+ * 在函数执行期间强制启用依赖跟踪。
122
+ * 即使当前处于不跟踪状态,也会建立依赖关系。
92
123
  *
93
- * @param fn 强制跟踪的函数。
124
+ * @param fn 要执行的函数
125
+ * @returns 函数的执行结果
94
126
  */
95
127
  export function forceTrack<T>(fn: () => T): T
96
128
  {
97
129
  const preShouldTrack = _shouldTrack;
130
+
98
131
  _shouldTrack = true;
99
132
  const result = fn();
133
+
100
134
  _shouldTrack = preShouldTrack;
101
135
 
102
136
  return result;
103
137
  }
104
138
 
105
139
  /**
106
- * 不跟踪。
140
+ * 禁用依赖跟踪。
141
+ *
142
+ * 在函数执行期间禁用依赖跟踪。
143
+ * 即使当前处于跟踪状态,也不会建立依赖关系。
107
144
  *
108
- * @param fn 不跟踪的函数。
145
+ * @param fn 要执行的函数
146
+ * @returns 函数的执行结果
109
147
  */
110
148
  export function noTrack<T>(fn: () => T): T
111
149
  {
112
150
  const preShouldTrack = _shouldTrack;
151
+
113
152
  _shouldTrack = false;
114
153
  const result = fn();
154
+
115
155
  _shouldTrack = preShouldTrack;
116
156
 
117
157
  return result;
118
158
  }
119
159
 
120
160
  /**
121
- * 是否应该跟踪的标志
122
- * 控制是否进行依赖跟踪
161
+ * 是否应该跟踪依赖的标志。
162
+ *
163
+ * 控制是否进行依赖跟踪。
164
+ * 可以通过 forceTrack 和 noTrack 函数临时修改此值。
123
165
  *
124
166
  * @private
125
167
  */