@feng3d/reactivity 1.0.7 → 1.0.8

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 (81) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +158 -158
  3. package/dist/index.js +89 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.umd.cjs +91 -2
  6. package/dist/index.umd.cjs.map +1 -1
  7. package/lib/ReactiveObject.d.ts +101 -0
  8. package/lib/ReactiveObject.d.ts.map +1 -0
  9. package/lib/batch.d.ts.map +1 -1
  10. package/lib/index.d.ts +1 -0
  11. package/lib/index.d.ts.map +1 -1
  12. package/package.json +69 -69
  13. package/src/ReactiveObject.ts +131 -0
  14. package/src/Reactivity.ts +168 -168
  15. package/src/arrayInstrumentations.ts +801 -801
  16. package/src/baseHandlers.ts +312 -312
  17. package/src/batch.ts +134 -118
  18. package/src/collectionHandlers.ts +486 -486
  19. package/src/computed.ts +253 -253
  20. package/src/effect.ts +146 -146
  21. package/src/effectScope.ts +294 -294
  22. package/src/index.ts +10 -9
  23. package/src/property.ts +231 -231
  24. package/src/reactive.ts +186 -186
  25. package/src/ref.ts +150 -150
  26. package/src/shared/constants.ts +41 -41
  27. package/src/shared/general.ts +109 -109
  28. package/tsconfig.json +19 -19
  29. package/dist/assets/RobotoMono-Medium-DVgDz_OO.woff2 +0 -0
  30. package/dist/assets/RobotoMono-Regular-BPoF81uy.woff2 +0 -0
  31. package/dist/assets/index-a2qCSG5V.css +0 -629
  32. package/dist/assets/index.html-Dyp3udP2.js +0 -200
  33. package/dist/assets/modulepreload-polyfill-DaKOjhqt.js +0 -37
  34. package/dist/assets/package-DuJynByc.js +0 -2539
  35. 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 +0 -59
  36. package/dist/assets/src//346/225/260/347/273/204/index.html-CHK6WEhd.js +0 -43
  37. package/dist/docs/.nojekyll +0 -1
  38. package/dist/docs/assets/hierarchy.js +0 -1
  39. package/dist/docs/assets/highlight.css +0 -92
  40. package/dist/docs/assets/icons.js +0 -18
  41. package/dist/docs/assets/icons.svg +0 -1
  42. package/dist/docs/assets/main.js +0 -60
  43. package/dist/docs/assets/navigation.js +0 -1
  44. package/dist/docs/assets/search.js +0 -1
  45. package/dist/docs/assets/style.css +0 -1640
  46. package/dist/docs/classes/EffectScope.html +0 -40
  47. package/dist/docs/functions/batchRun.html +0 -15
  48. package/dist/docs/functions/computed.html +0 -5
  49. package/dist/docs/functions/effect.html +0 -11
  50. package/dist/docs/functions/effectScope.html +0 -5
  51. package/dist/docs/functions/forceTrack.html +0 -6
  52. package/dist/docs/functions/getCurrentScope.html +0 -4
  53. package/dist/docs/functions/isProxy.html +0 -5
  54. package/dist/docs/functions/isReactive.html +0 -5
  55. package/dist/docs/functions/isRef.html +0 -5
  56. package/dist/docs/functions/noTrack.html +0 -6
  57. package/dist/docs/functions/onScopeDispose.html +0 -6
  58. package/dist/docs/functions/reactive.html +0 -19
  59. package/dist/docs/functions/ref.html +0 -13
  60. package/dist/docs/functions/toRaw.html +0 -4
  61. package/dist/docs/hierarchy.html +0 -1
  62. package/dist/docs/index.html +0 -129
  63. package/dist/docs/interfaces/Computed.html +0 -9
  64. package/dist/docs/interfaces/Effect.html +0 -8
  65. package/dist/docs/interfaces/Ref.html +0 -9
  66. package/dist/docs/modules.html +0 -1
  67. package/dist/docs/types/Reactive.html +0 -3
  68. package/dist/docs/types/UnReadonly.html +0 -3
  69. package/dist/files/RobotoMono-Medium.woff2 +0 -0
  70. package/dist/files/RobotoMono-Regular.woff2 +0 -0
  71. package/dist/files/ic_code_black_24dp.svg +0 -4
  72. package/dist/files/ic_search_black_24dp.svg +0 -4
  73. package/dist/files/main.css +0 -629
  74. package/dist/files/thumbnails.svg +0 -7
  75. package/dist/files.json +0 -7
  76. package/dist/index.html +0 -84
  77. package/dist/screenshots//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274.jpg +0 -0
  78. package/dist/screenshots//346/225/260/347/273/204.jpg +0 -0
  79. package/dist/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html +0 -70
  80. package/dist/src//346/225/260/347/273/204/index.html +0 -65
  81. package/dist/tags.json +0 -2
package/src/property.ts CHANGED
@@ -1,231 +1,231 @@
1
- import { batchRun } from './batch';
2
- import { Reactivity } from './Reactivity';
3
- import { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';
4
- import { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';
5
-
6
- /**
7
- * 反应式属性。
8
- *
9
- * @param target 对象。
10
- * @param key 属性
11
- * @returns 反应式属性。
12
- */
13
- function property<T, K extends keyof T>(target: T, key: K)
14
- {
15
- let depsMap = PropertyReactivity._targetMap.get(target);
16
-
17
- if (!depsMap)
18
- {
19
- depsMap = new Map();
20
- PropertyReactivity._targetMap.set(target, depsMap);
21
- }
22
-
23
- //
24
- let dep = depsMap.get(key);
25
-
26
- if (!dep)
27
- {
28
- dep = new PropertyReactivity(target, key);
29
- depsMap.set(key, dep);
30
- }
31
-
32
- return dep;
33
- }
34
-
35
- /**
36
- * 属性反应式节点。
37
- */
38
- export class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>
39
- {
40
- /**
41
- * 获取当前节点值。
42
- *
43
- * 取值时将会建立与父节点的依赖关系。
44
- */
45
- get value(): T
46
- {
47
- this.track();
48
-
49
- return this._value;
50
- }
51
-
52
- set value(v)
53
- {
54
- // 处理特殊字段,这些字段
55
- if (this._key === 'length')
56
- {
57
- v = this._target['length'];
58
- }
59
- else if (isSymbol(this._key))
60
- {
61
- v = ~~this._value + 1 as any;
62
- }
63
- if (v === this._value) return;
64
- // 触发属性的变化。
65
- this.trigger();
66
- this._value = v;
67
- }
68
-
69
- private _target: T;
70
- private _key: K;
71
-
72
- constructor(target: T, key: K)
73
- {
74
- super();
75
- this._target = target;
76
- this._key = key;
77
- if (target instanceof Map
78
- || target instanceof WeakMap
79
- )
80
- {
81
- this._value = (target as any as WeakMap<any, any>).get(key);
82
- }
83
- else if (target instanceof Set
84
- || target instanceof WeakSet
85
- )
86
- {
87
- this._value = (target as any as WeakSet<any>).has(key) as any;
88
- }
89
- else
90
- {
91
- this._value = (target as any)[key as any];
92
- }
93
- }
94
-
95
- triggerIfChanged()
96
- {
97
-
98
- }
99
-
100
- /**
101
- * 追踪属性的变化。
102
- *
103
- * 当属性被访问时,将会追踪属性的变化。
104
- *
105
- * @param target 目标对象。
106
- * @param key 属性名。
107
- * @returns
108
- */
109
- static track(target: object, type: TrackOpTypes, key: unknown): void
110
- {
111
- if (!Reactivity.activeReactivity) return;
112
-
113
- const dep = property(target as any, key as any);
114
-
115
- // 取值,建立依赖关系。
116
- dep.track();
117
- }
118
-
119
- /**
120
- * @private
121
- */
122
- static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();
123
-
124
- /**
125
- * 触发属性的变化。
126
- *
127
- * @param target 目标对象。
128
- * @param type 操作类型。
129
- * @param key 属性名。
130
- * @param newValue 新值。
131
- * @param oldValue 旧值。
132
- * @returns
133
- */
134
- static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void
135
- {
136
- const depsMap = this._targetMap.get(target);
137
-
138
- if (!depsMap) return;
139
-
140
- const run = (dep: PropertyReactivity<any, any> | undefined) =>
141
- {
142
- if (dep)
143
- {
144
- // 触发属性的变化。
145
- dep.value = newValue;
146
- }
147
- };
148
-
149
- batchRun(() =>
150
- {
151
- if (type === TriggerOpTypes.CLEAR)
152
- {
153
- // collection being cleared
154
- // trigger all effects for target
155
- depsMap.forEach(run);
156
- }
157
- else
158
- {
159
- const targetIsArray = isArray(target);
160
- const isArrayIndex = targetIsArray && isIntegerKey(key);
161
-
162
- if (targetIsArray && key === 'length')
163
- {
164
- const newLength = Number(newValue);
165
-
166
- depsMap.forEach((dep, key) =>
167
- {
168
- if (
169
- key === 'length'
170
- || key === ARRAY_ITERATE_KEY
171
- || (!isSymbol(key) && key >= newLength)
172
- )
173
- {
174
- run(dep);
175
- }
176
- });
177
- }
178
- else
179
- {
180
- // schedule runs for SET | ADD | DELETE
181
- if (key !== undefined || depsMap.has(undefined))
182
- {
183
- run(depsMap.get(key));
184
- }
185
-
186
- // schedule ARRAY_ITERATE for any numeric key change (length is handled above)
187
- if (isArrayIndex)
188
- {
189
- run(depsMap.get(ARRAY_ITERATE_KEY));
190
- }
191
-
192
- // also run for iteration key on ADD | DELETE | Map.SET
193
- switch (type)
194
- {
195
- case TriggerOpTypes.ADD:
196
- if (!targetIsArray)
197
- {
198
- run(depsMap.get(ITERATE_KEY));
199
- if (isMap(target))
200
- {
201
- run(depsMap.get(MAP_KEY_ITERATE_KEY));
202
- }
203
- }
204
- else if (isArrayIndex)
205
- {
206
- // new index added to array -> length changes
207
- run(depsMap.get('length'));
208
- }
209
- break;
210
- case TriggerOpTypes.DELETE:
211
- if (!targetIsArray)
212
- {
213
- run(depsMap.get(ITERATE_KEY));
214
- if (isMap(target))
215
- {
216
- run(depsMap.get(MAP_KEY_ITERATE_KEY));
217
- }
218
- }
219
- break;
220
- case TriggerOpTypes.SET:
221
- if (isMap(target))
222
- {
223
- run(depsMap.get(ITERATE_KEY));
224
- }
225
- break;
226
- }
227
- }
228
- }
229
- });
230
- }
231
- }
1
+ import { batchRun } from './batch';
2
+ import { Reactivity } from './Reactivity';
3
+ import { ARRAY_ITERATE_KEY, ITERATE_KEY, MAP_KEY_ITERATE_KEY, TrackOpTypes, TriggerOpTypes } from './shared/constants';
4
+ import { isArray, isIntegerKey, isMap, isSymbol } from './shared/general';
5
+
6
+ /**
7
+ * 反应式属性。
8
+ *
9
+ * @param target 对象。
10
+ * @param key 属性
11
+ * @returns 反应式属性。
12
+ */
13
+ function property<T, K extends keyof T>(target: T, key: K)
14
+ {
15
+ let depsMap = PropertyReactivity._targetMap.get(target);
16
+
17
+ if (!depsMap)
18
+ {
19
+ depsMap = new Map();
20
+ PropertyReactivity._targetMap.set(target, depsMap);
21
+ }
22
+
23
+ //
24
+ let dep = depsMap.get(key);
25
+
26
+ if (!dep)
27
+ {
28
+ dep = new PropertyReactivity(target, key);
29
+ depsMap.set(key, dep);
30
+ }
31
+
32
+ return dep;
33
+ }
34
+
35
+ /**
36
+ * 属性反应式节点。
37
+ */
38
+ export class PropertyReactivity<T, K extends keyof T> extends Reactivity<T>
39
+ {
40
+ /**
41
+ * 获取当前节点值。
42
+ *
43
+ * 取值时将会建立与父节点的依赖关系。
44
+ */
45
+ get value(): T
46
+ {
47
+ this.track();
48
+
49
+ return this._value;
50
+ }
51
+
52
+ set value(v)
53
+ {
54
+ // 处理特殊字段,这些字段
55
+ if (this._key === 'length')
56
+ {
57
+ v = this._target['length'];
58
+ }
59
+ else if (isSymbol(this._key))
60
+ {
61
+ v = ~~this._value + 1 as any;
62
+ }
63
+ if (v === this._value) return;
64
+ // 触发属性的变化。
65
+ this.trigger();
66
+ this._value = v;
67
+ }
68
+
69
+ private _target: T;
70
+ private _key: K;
71
+
72
+ constructor(target: T, key: K)
73
+ {
74
+ super();
75
+ this._target = target;
76
+ this._key = key;
77
+ if (target instanceof Map
78
+ || target instanceof WeakMap
79
+ )
80
+ {
81
+ this._value = (target as any as WeakMap<any, any>).get(key);
82
+ }
83
+ else if (target instanceof Set
84
+ || target instanceof WeakSet
85
+ )
86
+ {
87
+ this._value = (target as any as WeakSet<any>).has(key) as any;
88
+ }
89
+ else
90
+ {
91
+ this._value = (target as any)[key as any];
92
+ }
93
+ }
94
+
95
+ triggerIfChanged()
96
+ {
97
+
98
+ }
99
+
100
+ /**
101
+ * 追踪属性的变化。
102
+ *
103
+ * 当属性被访问时,将会追踪属性的变化。
104
+ *
105
+ * @param target 目标对象。
106
+ * @param key 属性名。
107
+ * @returns
108
+ */
109
+ static track(target: object, type: TrackOpTypes, key: unknown): void
110
+ {
111
+ if (!Reactivity.activeReactivity) return;
112
+
113
+ const dep = property(target as any, key as any);
114
+
115
+ // 取值,建立依赖关系。
116
+ dep.track();
117
+ }
118
+
119
+ /**
120
+ * @private
121
+ */
122
+ static _targetMap: WeakMap<any, Map<any, PropertyReactivity<any, any>>> = new WeakMap();
123
+
124
+ /**
125
+ * 触发属性的变化。
126
+ *
127
+ * @param target 目标对象。
128
+ * @param type 操作类型。
129
+ * @param key 属性名。
130
+ * @param newValue 新值。
131
+ * @param oldValue 旧值。
132
+ * @returns
133
+ */
134
+ static trigger(target: object, type: TriggerOpTypes, key?: unknown, newValue?: unknown, oldValue?: unknown): void
135
+ {
136
+ const depsMap = this._targetMap.get(target);
137
+
138
+ if (!depsMap) return;
139
+
140
+ const run = (dep: PropertyReactivity<any, any> | undefined) =>
141
+ {
142
+ if (dep)
143
+ {
144
+ // 触发属性的变化。
145
+ dep.value = newValue;
146
+ }
147
+ };
148
+
149
+ batchRun(() =>
150
+ {
151
+ if (type === TriggerOpTypes.CLEAR)
152
+ {
153
+ // collection being cleared
154
+ // trigger all effects for target
155
+ depsMap.forEach(run);
156
+ }
157
+ else
158
+ {
159
+ const targetIsArray = isArray(target);
160
+ const isArrayIndex = targetIsArray && isIntegerKey(key);
161
+
162
+ if (targetIsArray && key === 'length')
163
+ {
164
+ const newLength = Number(newValue);
165
+
166
+ depsMap.forEach((dep, key) =>
167
+ {
168
+ if (
169
+ key === 'length'
170
+ || key === ARRAY_ITERATE_KEY
171
+ || (!isSymbol(key) && key >= newLength)
172
+ )
173
+ {
174
+ run(dep);
175
+ }
176
+ });
177
+ }
178
+ else
179
+ {
180
+ // schedule runs for SET | ADD | DELETE
181
+ if (key !== undefined || depsMap.has(undefined))
182
+ {
183
+ run(depsMap.get(key));
184
+ }
185
+
186
+ // schedule ARRAY_ITERATE for any numeric key change (length is handled above)
187
+ if (isArrayIndex)
188
+ {
189
+ run(depsMap.get(ARRAY_ITERATE_KEY));
190
+ }
191
+
192
+ // also run for iteration key on ADD | DELETE | Map.SET
193
+ switch (type)
194
+ {
195
+ case TriggerOpTypes.ADD:
196
+ if (!targetIsArray)
197
+ {
198
+ run(depsMap.get(ITERATE_KEY));
199
+ if (isMap(target))
200
+ {
201
+ run(depsMap.get(MAP_KEY_ITERATE_KEY));
202
+ }
203
+ }
204
+ else if (isArrayIndex)
205
+ {
206
+ // new index added to array -> length changes
207
+ run(depsMap.get('length'));
208
+ }
209
+ break;
210
+ case TriggerOpTypes.DELETE:
211
+ if (!targetIsArray)
212
+ {
213
+ run(depsMap.get(ITERATE_KEY));
214
+ if (isMap(target))
215
+ {
216
+ run(depsMap.get(MAP_KEY_ITERATE_KEY));
217
+ }
218
+ }
219
+ break;
220
+ case TriggerOpTypes.SET:
221
+ if (isMap(target))
222
+ {
223
+ run(depsMap.get(ITERATE_KEY));
224
+ }
225
+ break;
226
+ }
227
+ }
228
+ }
229
+ });
230
+ }
231
+ }