@feng3d/reactivity 1.0.4 → 1.0.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.
Files changed (106) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +158 -158
  3. package/dist/assets/RobotoMono-Medium-DVgDz_OO.woff2 +0 -0
  4. package/dist/assets/RobotoMono-Regular-BPoF81uy.woff2 +0 -0
  5. package/dist/assets/index-a2qCSG5V.css +629 -0
  6. package/dist/assets/index.html-Dyp3udP2.js +200 -0
  7. package/dist/assets/modulepreload-polyfill-DaKOjhqt.js +37 -0
  8. package/dist/assets/package-9zMEdmDL.js +2540 -0
  9. package/dist/assets/src//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274/index.html-a69uOZEV.js +59 -0
  10. package/dist/assets/src//346/225/260/347/273/204/index.html-CaZ_5kCZ.js +43 -0
  11. package/dist/docs/.nojekyll +1 -0
  12. package/dist/docs/assets/hierarchy.js +1 -0
  13. package/dist/docs/assets/highlight.css +92 -0
  14. package/dist/docs/assets/icons.js +18 -0
  15. package/dist/docs/assets/icons.svg +1 -0
  16. package/dist/docs/assets/main.js +60 -0
  17. package/dist/docs/assets/navigation.js +1 -0
  18. package/dist/docs/assets/search.js +1 -0
  19. package/dist/docs/assets/style.css +1640 -0
  20. package/dist/docs/classes/ComputedReactivity.html +72 -0
  21. package/dist/docs/classes/EffectReactivity.html +62 -0
  22. package/dist/docs/classes/EffectScope.html +40 -0
  23. package/dist/docs/classes/Reactivity.html +35 -0
  24. package/dist/docs/classes/RefReactivity.html +57 -0
  25. package/dist/docs/functions/batchRun.html +15 -0
  26. package/dist/docs/functions/computed.html +5 -0
  27. package/dist/docs/functions/effect.html +11 -0
  28. package/dist/docs/functions/effectScope.html +5 -0
  29. package/dist/docs/functions/forceTrack.html +6 -0
  30. package/dist/docs/functions/getCurrentScope.html +4 -0
  31. package/dist/docs/functions/isProxy.html +5 -0
  32. package/dist/docs/functions/isReactive.html +5 -0
  33. package/dist/docs/functions/isRef.html +5 -0
  34. package/dist/docs/functions/noTrack.html +6 -0
  35. package/dist/docs/functions/onScopeDispose.html +6 -0
  36. package/dist/docs/functions/reactive.html +19 -0
  37. package/dist/docs/functions/ref.html +13 -0
  38. package/dist/docs/functions/toRaw.html +4 -0
  39. package/dist/docs/hierarchy.html +1 -0
  40. package/dist/docs/index.html +129 -0
  41. package/dist/docs/interfaces/Computed.html +9 -0
  42. package/dist/docs/interfaces/Effect.html +8 -0
  43. package/dist/docs/interfaces/Ref.html +9 -0
  44. package/dist/docs/modules.html +1 -0
  45. package/dist/docs/types/Reactive.html +3 -0
  46. package/dist/docs/types/UnReadonly.html +3 -0
  47. package/dist/files/RobotoMono-Medium.woff2 +0 -0
  48. package/dist/files/RobotoMono-Regular.woff2 +0 -0
  49. package/dist/files/ic_code_black_24dp.svg +4 -0
  50. package/dist/files/ic_search_black_24dp.svg +4 -0
  51. package/dist/files/main.css +629 -0
  52. package/dist/files/thumbnails.svg +7 -0
  53. package/dist/files.json +7 -0
  54. package/dist/index.html +84 -0
  55. package/dist/index.js +735 -156
  56. package/dist/index.js.map +1 -1
  57. package/dist/index.umd.cjs +735 -156
  58. package/dist/index.umd.cjs.map +1 -1
  59. package/dist/screenshots//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274.jpg +0 -0
  60. package/dist/screenshots//346/225/260/347/273/204.jpg +0 -0
  61. 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
  62. package/dist/src//346/225/260/347/273/204/index.html +65 -0
  63. package/dist/tags.json +2 -0
  64. package/lib/Reactivity.d.ts +47 -13
  65. package/lib/Reactivity.d.ts.map +1 -1
  66. package/lib/arrayInstrumentations.d.ts +10 -0
  67. package/lib/arrayInstrumentations.d.ts.map +1 -1
  68. package/lib/baseHandlers.d.ts +3 -1
  69. package/lib/baseHandlers.d.ts.map +1 -1
  70. package/lib/batch.d.ts +17 -5
  71. package/lib/batch.d.ts.map +1 -1
  72. package/lib/collectionHandlers.d.ts +21 -0
  73. package/lib/collectionHandlers.d.ts.map +1 -1
  74. package/lib/computed.d.ts +75 -27
  75. package/lib/computed.d.ts.map +1 -1
  76. package/lib/effect.d.ts +25 -0
  77. package/lib/effect.d.ts.map +1 -1
  78. package/lib/effectScope.d.ts +129 -0
  79. package/lib/effectScope.d.ts.map +1 -0
  80. package/lib/index.d.ts +6 -5
  81. package/lib/index.d.ts.map +1 -1
  82. package/lib/property.d.ts.map +1 -1
  83. package/lib/reactive.d.ts +63 -14
  84. package/lib/reactive.d.ts.map +1 -1
  85. package/lib/ref.d.ts +66 -4
  86. package/lib/ref.d.ts.map +1 -1
  87. package/lib/shared/constants.d.ts +7 -7
  88. package/lib/shared/constants.d.ts.map +1 -1
  89. package/lib/shared/general.d.ts +1 -1
  90. package/lib/shared/general.d.ts.map +1 -1
  91. package/package.json +71 -66
  92. package/src/Reactivity.ts +168 -126
  93. package/src/arrayInstrumentations.ts +801 -448
  94. package/src/baseHandlers.ts +312 -220
  95. package/src/batch.ts +118 -91
  96. package/src/collectionHandlers.ts +486 -298
  97. package/src/computed.ts +253 -204
  98. package/src/effect.ts +146 -108
  99. package/src/effectScope.ts +294 -0
  100. package/src/index.ts +9 -8
  101. package/src/property.ts +231 -225
  102. package/src/reactive.ts +186 -130
  103. package/src/ref.ts +150 -88
  104. package/src/shared/constants.ts +41 -41
  105. package/src/shared/general.ts +109 -109
  106. package/tsconfig.json +19 -19
@@ -1,220 +1,312 @@
1
- import { arrayInstrumentations } from './arrayInstrumentations';
2
- import { reactive, reactiveMap } from './reactive';
3
- import { isRef } from './ref';
4
- import { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';
5
- import { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';
6
- import { PropertyReactivity } from './property';
7
-
8
- /**
9
- * 基础响应式处理器。
10
- */
11
- class BaseReactiveHandler implements ProxyHandler<Target>
12
- {
13
- /**
14
- * 获取对象的属性值。
15
- *
16
- * @param target 对象本身
17
- * @param key 属性名
18
- * @param receiver 代理对象
19
- * @returns
20
- */
21
- get(target: Target, key: string | symbol, receiver: object): any
22
- {
23
- //
24
- if (key === ReactiveFlags.IS_REACTIVE) // 判断是否为响应式对象
25
- {
26
- return true;
27
- }
28
- else if (key === ReactiveFlags.RAW) // 获取原始对象
29
- {
30
- if (
31
- receiver
32
- === reactiveMap.get(target)
33
- // receiver is not the reactive proxy, but has the same prototype
34
- // this means the receiver is a user proxy of the reactive proxy
35
- || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)
36
- )
37
- {
38
- return target;
39
- }
40
- // early return undefined
41
-
42
- return;
43
- }
44
-
45
- const targetIsArray = isArray(target);
46
-
47
- let fn: Function | undefined;
48
- if (targetIsArray && (fn = arrayInstrumentations[key]))
49
- {
50
- return fn;
51
- }
52
- if (key === 'hasOwnProperty')
53
- {
54
- return hasOwnProperty;
55
- }
56
-
57
- const res = Reflect.get(
58
- target,
59
- key,
60
- isRef(target) ? target : receiver,
61
- );
62
-
63
- if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))
64
- {
65
- return res;
66
- }
67
-
68
- //
69
- PropertyReactivity.track(target, TrackOpTypes.GET, key as any);
70
-
71
- // 如果是 ref,则返回 ref.value
72
- if (isRef(res))
73
- {
74
- return targetIsArray && isIntegerKey(key) ? res : res.value;
75
- }
76
-
77
- // 如果是对象,则递归响应式化
78
- if (isObject(res))
79
- {
80
- return reactive(res);
81
- }
82
-
83
- return res;
84
- }
85
- }
86
-
87
- /**
88
- * 可变响应式处理器。
89
- */
90
- class MutableReactiveHandler extends BaseReactiveHandler
91
- {
92
- /**
93
- * 设置对象的属性值。
94
- * @param target 被代理的对象。
95
- * @param key 属性名。
96
- * @param value 新值。
97
- * @param receiver 代理对象。
98
- * @returns 设置是否成功。
99
- */
100
- set(
101
- target: Record<string | symbol, unknown>,
102
- key: string | symbol,
103
- value: unknown,
104
- receiver: object,
105
- ): boolean
106
- {
107
- let oldValue = target[key];
108
-
109
- oldValue = toRaw(oldValue);
110
- value = toRaw(value);
111
-
112
- if (!isArray(target) && isRef(oldValue) && !isRef(value))
113
- {
114
- oldValue.value = value;
115
-
116
- return true;
117
- }
118
-
119
- const hadKey
120
- = isArray(target) && isIntegerKey(key)
121
- ? Number(key) < target.length
122
- : hasOwn(target, key);
123
- const result = Reflect.set(
124
- target,
125
- key,
126
- value,
127
- isRef(target) ? target : receiver,
128
- );
129
- //
130
- __DEV__ && console.assert(target === toRaw(receiver));
131
-
132
- // 如果目标在原始原型链中,则不要触发
133
- if (target === toRaw(receiver))
134
- {
135
- if (!hadKey)
136
- {
137
- PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);
138
- }
139
- else if (hasChanged(value, oldValue))
140
- {
141
- PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);
142
- }
143
- }
144
-
145
- return result;
146
- }
147
-
148
- /**
149
- * 删除对象的属性。
150
- *
151
- * @param target 被代理的对象。
152
- * @param key 属性名。
153
- * @returns 删除是否成功。
154
- */
155
- deleteProperty(
156
- target: Record<string | symbol, unknown>,
157
- key: string | symbol,
158
- ): boolean
159
- {
160
- const hadKey = hasOwn(target, key);
161
- const oldValue = target[key];
162
- const result = Reflect.deleteProperty(target, key);
163
- if (result && hadKey)
164
- {
165
- PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);
166
- }
167
-
168
- return result;
169
- }
170
-
171
- has(target: Record<string | symbol, unknown>, key: string | symbol): boolean
172
- {
173
- const result = Reflect.has(target, key);
174
- if (!isSymbol(key) || !builtInSymbols.has(key))
175
- {
176
- PropertyReactivity.track(target, TrackOpTypes.HAS, key);
177
- }
178
-
179
- return result;
180
- }
181
-
182
- ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]
183
- {
184
- PropertyReactivity.track(
185
- target,
186
- TrackOpTypes.ITERATE,
187
- isArray(target) ? 'length' : ITERATE_KEY,
188
- );
189
-
190
- return Reflect.ownKeys(target);
191
- }
192
- }
193
-
194
- /**
195
- * 可变响应式处理器。
196
- */
197
- export const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();
198
-
199
- function hasOwnProperty(this: object, key: unknown)
200
- {
201
- // #10455 hasOwnProperty may be called with non-string values
202
- if (!isSymbol(key)) key = String(key);
203
- const obj = toRaw(this);
204
- PropertyReactivity.track(obj, TrackOpTypes.HAS, key);
205
-
206
- return obj.hasOwnProperty(key as string);
207
- }
208
-
209
- const builtInSymbols = new Set(
210
- /* @__PURE__*/
211
- Object.getOwnPropertyNames(Symbol)
212
- // ios10.x Object.getOwnPropertyNames(Symbol) can enumerate 'arguments' and 'caller'
213
- // but accessing them on Symbol leads to TypeError because Symbol is a strict mode
214
- // function
215
- .filter((key) => key !== 'arguments' && key !== 'caller')
216
- .map((key) => Symbol[key as keyof SymbolConstructor])
217
- .filter(isSymbol),
218
- );
219
-
220
- const isNonTrackableKeys = /* @__PURE__*/ makeMap(`__proto__,__v_isRef,__isVue`);
1
+ import { arrayInstrumentations } from './arrayInstrumentations';
2
+ import { reactive, reactiveMap } from './reactive';
3
+ import { isRef } from './ref';
4
+ import { ITERATE_KEY, ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './shared/constants';
5
+ import { hasChanged, hasOwn, isArray, isIntegerKey, isObject, isSymbol, makeMap, Target, toRaw } from './shared/general';
6
+ import { PropertyReactivity } from './property';
7
+
8
+ /**
9
+ * 基础响应式处理器。
10
+ *
11
+ * 实现了 Proxy 的 get 拦截器,用于:
12
+ * 1. 响应式对象的标识和原始对象获取
13
+ * 2. 数组方法的特殊处理
14
+ * 3. 属性的依赖追踪
15
+ * 4. 值的自动解包和响应式转换
16
+ */
17
+ class BaseReactiveHandler implements ProxyHandler<Target>
18
+ {
19
+ /**
20
+ * 获取对象的属性值。
21
+ *
22
+ * 实现了以下功能:
23
+ * 1. 响应式对象标识检查
24
+ * 2. 原始对象获取
25
+ * 3. 数组方法拦截
26
+ * 4. 属性依赖追踪
27
+ * 5. 值的自动解包
28
+ * 6. 对象的自动响应式转换
29
+ *
30
+ * @param target 被代理的原始对象
31
+ * @param key 要获取的属性名
32
+ * @param receiver 代理对象本身
33
+ * @returns 获取到的属性值
34
+ */
35
+ get(target: Target, key: string | symbol, receiver: object): any
36
+ {
37
+ // 检查是否为响应式对象
38
+ if (key === ReactiveFlags.IS_REACTIVE)
39
+ {
40
+ return true;
41
+ }
42
+ // 获取原始对象
43
+ else if (key === ReactiveFlags.RAW)
44
+ {
45
+ if (
46
+ receiver === reactiveMap.get(target)
47
+ // receiver 不是响应式代理,但具有相同的原型
48
+ // 这意味着 receiver 是响应式代理的用户代理
49
+ || Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)
50
+ )
51
+ {
52
+ return target;
53
+ }
54
+
55
+ // 提前返回 undefined
56
+ return;
57
+ }
58
+
59
+ const targetIsArray = isArray(target);
60
+
61
+ // 处理数组方法
62
+ let fn: Function | undefined;
63
+
64
+ if (targetIsArray && (fn = arrayInstrumentations[key]))
65
+ {
66
+ return fn;
67
+ }
68
+ // 处理 hasOwnProperty 方法
69
+ if (key === 'hasOwnProperty')
70
+ {
71
+ return hasOwnProperty;
72
+ }
73
+
74
+ // 获取属性值
75
+ const res = Reflect.get(
76
+ target,
77
+ key,
78
+ isRef(target) ? target : receiver,
79
+ );
80
+
81
+ // 跳过内置 Symbol 和非追踪键的依赖追踪
82
+ if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key))
83
+ {
84
+ return res;
85
+ }
86
+
87
+ // 追踪属性访问
88
+ PropertyReactivity.track(target, TrackOpTypes.GET, key as any);
89
+
90
+ // 自动解包 ref
91
+ if (isRef(res))
92
+ {
93
+ return targetIsArray && isIntegerKey(key) ? res : res.value;
94
+ }
95
+
96
+ // 自动转换对象为响应式
97
+ if (isObject(res))
98
+ {
99
+ return reactive(res);
100
+ }
101
+
102
+ return res;
103
+ }
104
+ }
105
+
106
+ /**
107
+ * 可变响应式处理器。
108
+ *
109
+ * 继承自基础响应式处理器,增加了:
110
+ * 1. 属性设置拦截
111
+ * 2. 属性删除拦截
112
+ * 3. 属性存在性检查拦截
113
+ * 4. 属性遍历拦截
114
+ */
115
+ class MutableReactiveHandler extends BaseReactiveHandler
116
+ {
117
+ /**
118
+ * 设置对象的属性值。
119
+ *
120
+ * 实现了以下功能:
121
+ * 1. 值的原始化处理
122
+ * 2. ref 值的特殊处理
123
+ * 3. 属性变更通知
124
+ * 4. 数组长度的特殊处理
125
+ *
126
+ * @param target 被代理的原始对象
127
+ * @param key 要设置的属性名
128
+ * @param value 要设置的新值
129
+ * @param receiver 代理对象本身
130
+ * @returns 设置是否成功
131
+ */
132
+ set(
133
+ target: Record<string | symbol, unknown>,
134
+ key: string | symbol,
135
+ value: unknown,
136
+ receiver: object,
137
+ ): boolean
138
+ {
139
+ let oldValue = target[key];
140
+
141
+ // 获取原始值进行比较
142
+ oldValue = toRaw(oldValue);
143
+ value = toRaw(value);
144
+
145
+ // 处理 ref 值的特殊情况
146
+ if (!isArray(target) && isRef(oldValue) && !isRef(value))
147
+ {
148
+ oldValue.value = value;
149
+
150
+ return true;
151
+ }
152
+
153
+ // 检查属性是否存在
154
+ const hadKey
155
+ = isArray(target) && isIntegerKey(key)
156
+ ? Number(key) < target.length
157
+ : hasOwn(target, key);
158
+ const result = Reflect.set(
159
+ target,
160
+ key,
161
+ value,
162
+ isRef(target) ? target : receiver,
163
+ );
164
+
165
+ // 确保目标在原始原型链中
166
+ __DEV__ && console.assert(target === toRaw(receiver));
167
+
168
+ // 触发属性变更通知
169
+ if (target === toRaw(receiver))
170
+ {
171
+ if (!hadKey)
172
+ {
173
+ // 新增属性
174
+ PropertyReactivity.trigger(target, TriggerOpTypes.ADD, key, value);
175
+ }
176
+ else if (hasChanged(value, oldValue))
177
+ {
178
+ // 修改属性
179
+ PropertyReactivity.trigger(target, TriggerOpTypes.SET, key, value, oldValue);
180
+ }
181
+ }
182
+
183
+ return result;
184
+ }
185
+
186
+ /**
187
+ * 删除对象的属性。
188
+ *
189
+ * 实现了以下功能:
190
+ * 1. 属性删除操作
191
+ * 2. 删除后的变更通知
192
+ *
193
+ * @param target 被代理的原始对象
194
+ * @param key 要删除的属性名
195
+ * @returns 删除是否成功
196
+ */
197
+ deleteProperty(
198
+ target: Record<string | symbol, unknown>,
199
+ key: string | symbol,
200
+ ): boolean
201
+ {
202
+ const hadKey = hasOwn(target, key);
203
+ const oldValue = target[key];
204
+ const result = Reflect.deleteProperty(target, key);
205
+
206
+ if (result && hadKey)
207
+ {
208
+ // 触发删除通知
209
+ PropertyReactivity.trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue);
210
+ }
211
+
212
+ return result;
213
+ }
214
+
215
+ /**
216
+ * 检查对象是否包含某个属性。
217
+ *
218
+ * 实现了以下功能:
219
+ * 1. 属性存在性检查
220
+ * 2. 属性访问依赖追踪
221
+ *
222
+ * @param target 被代理的原始对象
223
+ * @param key 要检查的属性名
224
+ * @returns 属性是否存在
225
+ */
226
+ has(target: Record<string | symbol, unknown>, key: string | symbol): boolean
227
+ {
228
+ const result = Reflect.has(target, key);
229
+
230
+ if (!isSymbol(key) || !builtInSymbols.has(key))
231
+ {
232
+ // 追踪属性访问
233
+ PropertyReactivity.track(target, TrackOpTypes.HAS, key);
234
+ }
235
+
236
+ return result;
237
+ }
238
+
239
+ /**
240
+ * 获取对象的所有属性名。
241
+ *
242
+ * 实现了以下功能:
243
+ * 1. 属性遍历
244
+ * 2. 遍历操作的依赖追踪
245
+ *
246
+ * @param target 被代理的原始对象
247
+ * @returns 对象的所有属性名数组
248
+ */
249
+ ownKeys(target: Record<string | symbol, unknown>): (string | symbol)[]
250
+ {
251
+ // 追踪遍历操作
252
+ PropertyReactivity.track(
253
+ target,
254
+ TrackOpTypes.ITERATE,
255
+ isArray(target) ? 'length' : ITERATE_KEY,
256
+ );
257
+
258
+ return Reflect.ownKeys(target);
259
+ }
260
+ }
261
+
262
+ /**
263
+ * 可变响应式处理器实例。
264
+ *
265
+ * 用于创建可变的响应式对象。
266
+ */
267
+ export const mutableHandlers: ProxyHandler<object> = new MutableReactiveHandler();
268
+
269
+ /**
270
+ * 自定义 hasOwnProperty 方法。
271
+ *
272
+ * 实现了以下功能:
273
+ * 1. 属性存在性检查
274
+ * 2. 属性访问依赖追踪
275
+ *
276
+ * @param this 调用对象
277
+ * @param key 要检查的属性名
278
+ * @returns 属性是否存在
279
+ */
280
+ function hasOwnProperty(this: object, key: unknown)
281
+ {
282
+ // #10455 hasOwnProperty 可能被非字符串值调用
283
+ if (!isSymbol(key)) key = String(key);
284
+ const obj = toRaw(this);
285
+
286
+ // 追踪属性访问
287
+ PropertyReactivity.track(obj, TrackOpTypes.HAS, key);
288
+
289
+ return obj.hasOwnProperty(key as string);
290
+ }
291
+
292
+ /**
293
+ * 内置 Symbol 集合。
294
+ *
295
+ * 用于过滤不需要追踪的 Symbol 属性。
296
+ */
297
+ const builtInSymbols = new Set(
298
+ /* @__PURE__ */
299
+ Object.getOwnPropertyNames(Symbol)
300
+ // ios10.x Object.getOwnPropertyNames(Symbol) 可以枚举 'arguments' 和 'caller'
301
+ // 但在 Symbol 上访问它们会导致 TypeError,因为 Symbol 是严格模式函数
302
+ .filter((key) => key !== 'arguments' && key !== 'caller')
303
+ .map((key) => Symbol[key as keyof SymbolConstructor])
304
+ .filter(isSymbol),
305
+ );
306
+
307
+ /**
308
+ * 非追踪键集合。
309
+ *
310
+ * 用于过滤不需要追踪的属性名。
311
+ */
312
+ const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);