@feng3d/reactivity 1.0.3 → 1.0.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/src/Reactivity.ts CHANGED
@@ -1,126 +1,126 @@
1
- import { type ComputedReactivity } from './computed';
2
-
3
- /**
4
- * 反应式节点。
5
- *
6
- * 拥有节点值以及被捕捉与触发的能力。
7
- *
8
- * 用于被 computed effect 等构建的节点所继承。
9
- */
10
- export class Reactivity<T = any>
11
- {
12
- /**
13
- * 获取当前节点值。
14
- *
15
- * 取值时将会建立与父节点的依赖关系。
16
- */
17
- get value(): T
18
- {
19
- this.track();
20
-
21
- return this._value;
22
- }
23
- /**
24
- * @private
25
- */
26
- _value: T;
27
-
28
- /**
29
- * 父反应节点。
30
- *
31
- * 记录了哪些节点调用了当前节点。
32
- *
33
- * 当前节点失效时,会通知并移除所有父节点。
34
- *
35
- * @private
36
- */
37
- _parents = new Map<ComputedReactivity, number>();
38
-
39
- /**
40
- * 捕捉。
41
- *
42
- * 建立与父节点的依赖关系。
43
- */
44
- track()
45
- {
46
- if (!_shouldTrack) return;
47
-
48
- // 连接父节点和子节点。
49
- const parent = Reactivity.activeReactivity;
50
- if (parent)
51
- {
52
- this._parents.set(parent, parent._version);
53
- }
54
- }
55
-
56
- /**
57
- * 触发。
58
- *
59
- * 冒泡到所有父节点,设置失效子节点字典。
60
- */
61
- trigger()
62
- {
63
- // 冒泡到所有父节点,设置失效子节点字典。
64
- this._parents.forEach((version, parent) =>
65
- {
66
- if (parent._version !== version) return;
67
-
68
- parent.trigger();
69
- // 失效时添加子节点到父节点中。
70
- parent._children.set(this, this._value);
71
- });
72
-
73
- //
74
- this._parents.clear();
75
- }
76
-
77
- /**
78
- * 当前正在执行的反应式节点。
79
- *
80
- * @internal
81
- */
82
- static activeReactivity: ComputedReactivity;
83
- }
84
-
85
- /**
86
- * 反应式节点链。
87
- */
88
- export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
89
-
90
- /**
91
- * 强制跟踪。
92
- *
93
- * @param fn 强制跟踪的函数。
94
- */
95
- export function forceTrack<T>(fn: () => T): T
96
- {
97
- const preShouldTrack = _shouldTrack;
98
- _shouldTrack = true;
99
- const result = fn();
100
- _shouldTrack = preShouldTrack;
101
-
102
- return result;
103
- }
104
-
105
- /**
106
- * 不跟踪。
107
- *
108
- * @param fn 不跟踪的函数。
109
- */
110
- export function noTrack<T>(fn: () => T): T
111
- {
112
- const preShouldTrack = _shouldTrack;
113
- _shouldTrack = false;
114
- const result = fn();
115
- _shouldTrack = preShouldTrack;
116
-
117
- return result;
118
- }
119
-
120
- /**
121
- * 是否应该跟踪的标志
122
- * 控制是否进行依赖跟踪
123
- *
124
- * @private
125
- */
126
- let _shouldTrack = true;
1
+ import { type ComputedReactivity } from './computed';
2
+
3
+ /**
4
+ * 反应式节点。
5
+ *
6
+ * 拥有节点值以及被捕捉与触发的能力。
7
+ *
8
+ * 用于被 computed effect 等构建的节点所继承。
9
+ */
10
+ export class Reactivity<T = any>
11
+ {
12
+ /**
13
+ * 获取当前节点值。
14
+ *
15
+ * 取值时将会建立与父节点的依赖关系。
16
+ */
17
+ get value(): T
18
+ {
19
+ this.track();
20
+
21
+ return this._value;
22
+ }
23
+ /**
24
+ * @private
25
+ */
26
+ _value: T;
27
+
28
+ /**
29
+ * 父反应节点。
30
+ *
31
+ * 记录了哪些节点调用了当前节点。
32
+ *
33
+ * 当前节点失效时,会通知并移除所有父节点。
34
+ *
35
+ * @private
36
+ */
37
+ _parents = new Map<ComputedReactivity, number>();
38
+
39
+ /**
40
+ * 捕捉。
41
+ *
42
+ * 建立与父节点的依赖关系。
43
+ */
44
+ track()
45
+ {
46
+ if (!Reactivity.activeReactivity || !_shouldTrack) return;
47
+
48
+ // 连接父节点和子节点。
49
+ const parent = Reactivity.activeReactivity;
50
+ if (parent)
51
+ {
52
+ this._parents.set(parent, parent._version);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * 触发。
58
+ *
59
+ * 冒泡到所有父节点,设置失效子节点字典。
60
+ */
61
+ trigger()
62
+ {
63
+ // 冒泡到所有父节点,设置失效子节点字典。
64
+ this._parents.forEach((version, parent) =>
65
+ {
66
+ if (parent._version !== version) return;
67
+
68
+ parent.trigger();
69
+ // 失效时添加子节点到父节点中。
70
+ parent._children.set(this, this._value);
71
+ });
72
+
73
+ //
74
+ this._parents.clear();
75
+ }
76
+
77
+ /**
78
+ * 当前正在执行的反应式节点。
79
+ *
80
+ * @internal
81
+ */
82
+ static activeReactivity: ComputedReactivity;
83
+ }
84
+
85
+ /**
86
+ * 反应式节点链。
87
+ */
88
+ export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
89
+
90
+ /**
91
+ * 强制跟踪。
92
+ *
93
+ * @param fn 强制跟踪的函数。
94
+ */
95
+ export function forceTrack<T>(fn: () => T): T
96
+ {
97
+ const preShouldTrack = _shouldTrack;
98
+ _shouldTrack = true;
99
+ const result = fn();
100
+ _shouldTrack = preShouldTrack;
101
+
102
+ return result;
103
+ }
104
+
105
+ /**
106
+ * 不跟踪。
107
+ *
108
+ * @param fn 不跟踪的函数。
109
+ */
110
+ export function noTrack<T>(fn: () => T): T
111
+ {
112
+ const preShouldTrack = _shouldTrack;
113
+ _shouldTrack = false;
114
+ const result = fn();
115
+ _shouldTrack = preShouldTrack;
116
+
117
+ return result;
118
+ }
119
+
120
+ /**
121
+ * 是否应该跟踪的标志
122
+ * 控制是否进行依赖跟踪
123
+ *
124
+ * @private
125
+ */
126
+ let _shouldTrack = true;