@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.
- package/LICENSE +21 -21
- package/README.md +158 -158
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.cjs +91 -2
- package/dist/index.umd.cjs.map +1 -1
- package/lib/ReactiveObject.d.ts +101 -0
- package/lib/ReactiveObject.d.ts.map +1 -0
- package/lib/batch.d.ts.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/package.json +69 -69
- package/src/ReactiveObject.ts +131 -0
- package/src/Reactivity.ts +168 -168
- package/src/arrayInstrumentations.ts +801 -801
- package/src/baseHandlers.ts +312 -312
- package/src/batch.ts +134 -118
- package/src/collectionHandlers.ts +486 -486
- package/src/computed.ts +253 -253
- package/src/effect.ts +146 -146
- package/src/effectScope.ts +294 -294
- package/src/index.ts +10 -9
- package/src/property.ts +231 -231
- package/src/reactive.ts +186 -186
- package/src/ref.ts +150 -150
- package/src/shared/constants.ts +41 -41
- package/src/shared/general.ts +109 -109
- package/tsconfig.json +19 -19
- package/dist/assets/RobotoMono-Medium-DVgDz_OO.woff2 +0 -0
- package/dist/assets/RobotoMono-Regular-BPoF81uy.woff2 +0 -0
- package/dist/assets/index-a2qCSG5V.css +0 -629
- package/dist/assets/index.html-Dyp3udP2.js +0 -200
- package/dist/assets/modulepreload-polyfill-DaKOjhqt.js +0 -37
- package/dist/assets/package-DuJynByc.js +0 -2539
- 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
- package/dist/assets/src//346/225/260/347/273/204/index.html-CHK6WEhd.js +0 -43
- package/dist/docs/.nojekyll +0 -1
- package/dist/docs/assets/hierarchy.js +0 -1
- package/dist/docs/assets/highlight.css +0 -92
- package/dist/docs/assets/icons.js +0 -18
- package/dist/docs/assets/icons.svg +0 -1
- package/dist/docs/assets/main.js +0 -60
- package/dist/docs/assets/navigation.js +0 -1
- package/dist/docs/assets/search.js +0 -1
- package/dist/docs/assets/style.css +0 -1640
- package/dist/docs/classes/EffectScope.html +0 -40
- package/dist/docs/functions/batchRun.html +0 -15
- package/dist/docs/functions/computed.html +0 -5
- package/dist/docs/functions/effect.html +0 -11
- package/dist/docs/functions/effectScope.html +0 -5
- package/dist/docs/functions/forceTrack.html +0 -6
- package/dist/docs/functions/getCurrentScope.html +0 -4
- package/dist/docs/functions/isProxy.html +0 -5
- package/dist/docs/functions/isReactive.html +0 -5
- package/dist/docs/functions/isRef.html +0 -5
- package/dist/docs/functions/noTrack.html +0 -6
- package/dist/docs/functions/onScopeDispose.html +0 -6
- package/dist/docs/functions/reactive.html +0 -19
- package/dist/docs/functions/ref.html +0 -13
- package/dist/docs/functions/toRaw.html +0 -4
- package/dist/docs/hierarchy.html +0 -1
- package/dist/docs/index.html +0 -129
- package/dist/docs/interfaces/Computed.html +0 -9
- package/dist/docs/interfaces/Effect.html +0 -8
- package/dist/docs/interfaces/Ref.html +0 -9
- package/dist/docs/modules.html +0 -1
- package/dist/docs/types/Reactive.html +0 -3
- package/dist/docs/types/UnReadonly.html +0 -3
- package/dist/files/RobotoMono-Medium.woff2 +0 -0
- package/dist/files/RobotoMono-Regular.woff2 +0 -0
- package/dist/files/ic_code_black_24dp.svg +0 -4
- package/dist/files/ic_search_black_24dp.svg +0 -4
- package/dist/files/main.css +0 -629
- package/dist/files/thumbnails.svg +0 -7
- package/dist/files.json +0 -7
- package/dist/index.html +0 -84
- package/dist/screenshots//345/244/215/346/235/202/346/203/205/345/206/265/345/217/226/345/200/274.jpg +0 -0
- package/dist/screenshots//346/225/260/347/273/204.jpg +0 -0
- 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
- package/dist/src//346/225/260/347/273/204/index.html +0 -65
- package/dist/tags.json +0 -2
package/src/Reactivity.ts
CHANGED
|
@@ -1,168 +1,168 @@
|
|
|
1
|
-
import { type ComputedReactivity } from './computed';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* 反应式节点基类。
|
|
5
|
-
*
|
|
6
|
-
* 拥有节点值以及被捕捉与触发的能力。
|
|
7
|
-
* 用于被 computed、effect 等构建的节点所继承。
|
|
8
|
-
*
|
|
9
|
-
* 实现了响应式系统的核心功能:
|
|
10
|
-
* 1. 值的存储和访问
|
|
11
|
-
* 2. 依赖关系的建立(track)
|
|
12
|
-
* 3. 变更通知的传播(trigger)
|
|
13
|
-
*/
|
|
14
|
-
export class Reactivity<T = any>
|
|
15
|
-
{
|
|
16
|
-
/**
|
|
17
|
-
* 获取当前节点值。
|
|
18
|
-
*
|
|
19
|
-
* 取值时将会建立与父节点的依赖关系。
|
|
20
|
-
* 当其他响应式节点访问此值时,会自动建立依赖关系。
|
|
21
|
-
*/
|
|
22
|
-
get value(): T
|
|
23
|
-
{
|
|
24
|
-
this.track();
|
|
25
|
-
|
|
26
|
-
return this._value;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* @private
|
|
31
|
-
*/
|
|
32
|
-
_value: T;
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* 父反应节点集合。
|
|
36
|
-
*
|
|
37
|
-
* 记录了哪些节点依赖了当前节点。
|
|
38
|
-
* 当当前节点值发生变化时,会通知所有父节点。
|
|
39
|
-
*
|
|
40
|
-
* Map 的 key 是父节点,value 是父节点的版本号。
|
|
41
|
-
* 版本号用于判断依赖关系是否过期。
|
|
42
|
-
*
|
|
43
|
-
* @private
|
|
44
|
-
*/
|
|
45
|
-
_parents = new Map<ComputedReactivity, number>();
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* 建立依赖关系。
|
|
49
|
-
*
|
|
50
|
-
* 当其他节点访问当前节点的值时,会调用此方法。
|
|
51
|
-
* 将当前节点与访问者(父节点)建立依赖关系。
|
|
52
|
-
*
|
|
53
|
-
* 如果当前没有活动的响应式节点,或者不应该跟踪依赖,则不会建立依赖关系。
|
|
54
|
-
*/
|
|
55
|
-
track()
|
|
56
|
-
{
|
|
57
|
-
if (!Reactivity.activeReactivity || !_shouldTrack) return;
|
|
58
|
-
|
|
59
|
-
// 连接父节点和子节点。
|
|
60
|
-
const parent = Reactivity.activeReactivity;
|
|
61
|
-
|
|
62
|
-
if (parent)
|
|
63
|
-
{
|
|
64
|
-
this._parents.set(parent, parent._version);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* 触发更新。
|
|
70
|
-
*
|
|
71
|
-
* 当节点值发生变化时,会调用此方法。
|
|
72
|
-
* 通知所有依赖此节点的父节点进行更新。
|
|
73
|
-
*
|
|
74
|
-
* 更新过程:
|
|
75
|
-
* 1. 遍历所有父节点
|
|
76
|
-
* 2. 检查父节点的版本号是否匹配
|
|
77
|
-
* 3. 触发父节点的更新
|
|
78
|
-
* 4. 将当前节点添加到父节点的失效子节点集合中
|
|
79
|
-
*/
|
|
80
|
-
trigger()
|
|
81
|
-
{
|
|
82
|
-
// 冒泡到所有父节点,设置失效子节点字典。
|
|
83
|
-
this._parents.forEach((version, parent) =>
|
|
84
|
-
{
|
|
85
|
-
if (parent._version !== version) return;
|
|
86
|
-
|
|
87
|
-
parent.trigger();
|
|
88
|
-
// 失效时添加子节点到父节点中。
|
|
89
|
-
parent._children.set(this, this._value);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
//
|
|
93
|
-
this._parents.clear();
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* 当前正在执行的反应式节点。
|
|
98
|
-
*
|
|
99
|
-
* 用于在依赖收集过程中标识当前正在执行的节点。
|
|
100
|
-
* 当其他节点访问此节点的值时,会将其作为父节点。
|
|
101
|
-
*
|
|
102
|
-
* @internal
|
|
103
|
-
*/
|
|
104
|
-
static activeReactivity: ComputedReactivity;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 反应式节点链。
|
|
109
|
-
*
|
|
110
|
-
* 用于表示响应式节点之间的依赖关系链。
|
|
111
|
-
* 每个节点包含:
|
|
112
|
-
* 1. 节点本身
|
|
113
|
-
* 2. 节点的值
|
|
114
|
-
* 3. 下一个节点的引用
|
|
115
|
-
*/
|
|
116
|
-
export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* 强制跟踪依赖。
|
|
120
|
-
*
|
|
121
|
-
* 在函数执行期间强制启用依赖跟踪。
|
|
122
|
-
* 即使当前处于不跟踪状态,也会建立依赖关系。
|
|
123
|
-
*
|
|
124
|
-
* @param fn 要执行的函数
|
|
125
|
-
* @returns 函数的执行结果
|
|
126
|
-
*/
|
|
127
|
-
export function forceTrack<T>(fn: () => T): T
|
|
128
|
-
{
|
|
129
|
-
const preShouldTrack = _shouldTrack;
|
|
130
|
-
|
|
131
|
-
_shouldTrack = true;
|
|
132
|
-
const result = fn();
|
|
133
|
-
|
|
134
|
-
_shouldTrack = preShouldTrack;
|
|
135
|
-
|
|
136
|
-
return result;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* 禁用依赖跟踪。
|
|
141
|
-
*
|
|
142
|
-
* 在函数执行期间禁用依赖跟踪。
|
|
143
|
-
* 即使当前处于跟踪状态,也不会建立依赖关系。
|
|
144
|
-
*
|
|
145
|
-
* @param fn 要执行的函数
|
|
146
|
-
* @returns 函数的执行结果
|
|
147
|
-
*/
|
|
148
|
-
export function noTrack<T>(fn: () => T): T
|
|
149
|
-
{
|
|
150
|
-
const preShouldTrack = _shouldTrack;
|
|
151
|
-
|
|
152
|
-
_shouldTrack = false;
|
|
153
|
-
const result = fn();
|
|
154
|
-
|
|
155
|
-
_shouldTrack = preShouldTrack;
|
|
156
|
-
|
|
157
|
-
return result;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* 是否应该跟踪依赖的标志。
|
|
162
|
-
*
|
|
163
|
-
* 控制是否进行依赖跟踪。
|
|
164
|
-
* 可以通过 forceTrack 和 noTrack 函数临时修改此值。
|
|
165
|
-
*
|
|
166
|
-
* @private
|
|
167
|
-
*/
|
|
168
|
-
let _shouldTrack = true;
|
|
1
|
+
import { type ComputedReactivity } from './computed';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 反应式节点基类。
|
|
5
|
+
*
|
|
6
|
+
* 拥有节点值以及被捕捉与触发的能力。
|
|
7
|
+
* 用于被 computed、effect 等构建的节点所继承。
|
|
8
|
+
*
|
|
9
|
+
* 实现了响应式系统的核心功能:
|
|
10
|
+
* 1. 值的存储和访问
|
|
11
|
+
* 2. 依赖关系的建立(track)
|
|
12
|
+
* 3. 变更通知的传播(trigger)
|
|
13
|
+
*/
|
|
14
|
+
export class Reactivity<T = any>
|
|
15
|
+
{
|
|
16
|
+
/**
|
|
17
|
+
* 获取当前节点值。
|
|
18
|
+
*
|
|
19
|
+
* 取值时将会建立与父节点的依赖关系。
|
|
20
|
+
* 当其他响应式节点访问此值时,会自动建立依赖关系。
|
|
21
|
+
*/
|
|
22
|
+
get value(): T
|
|
23
|
+
{
|
|
24
|
+
this.track();
|
|
25
|
+
|
|
26
|
+
return this._value;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
_value: T;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 父反应节点集合。
|
|
36
|
+
*
|
|
37
|
+
* 记录了哪些节点依赖了当前节点。
|
|
38
|
+
* 当当前节点值发生变化时,会通知所有父节点。
|
|
39
|
+
*
|
|
40
|
+
* Map 的 key 是父节点,value 是父节点的版本号。
|
|
41
|
+
* 版本号用于判断依赖关系是否过期。
|
|
42
|
+
*
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
_parents = new Map<ComputedReactivity, number>();
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 建立依赖关系。
|
|
49
|
+
*
|
|
50
|
+
* 当其他节点访问当前节点的值时,会调用此方法。
|
|
51
|
+
* 将当前节点与访问者(父节点)建立依赖关系。
|
|
52
|
+
*
|
|
53
|
+
* 如果当前没有活动的响应式节点,或者不应该跟踪依赖,则不会建立依赖关系。
|
|
54
|
+
*/
|
|
55
|
+
track()
|
|
56
|
+
{
|
|
57
|
+
if (!Reactivity.activeReactivity || !_shouldTrack) return;
|
|
58
|
+
|
|
59
|
+
// 连接父节点和子节点。
|
|
60
|
+
const parent = Reactivity.activeReactivity;
|
|
61
|
+
|
|
62
|
+
if (parent)
|
|
63
|
+
{
|
|
64
|
+
this._parents.set(parent, parent._version);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* 触发更新。
|
|
70
|
+
*
|
|
71
|
+
* 当节点值发生变化时,会调用此方法。
|
|
72
|
+
* 通知所有依赖此节点的父节点进行更新。
|
|
73
|
+
*
|
|
74
|
+
* 更新过程:
|
|
75
|
+
* 1. 遍历所有父节点
|
|
76
|
+
* 2. 检查父节点的版本号是否匹配
|
|
77
|
+
* 3. 触发父节点的更新
|
|
78
|
+
* 4. 将当前节点添加到父节点的失效子节点集合中
|
|
79
|
+
*/
|
|
80
|
+
trigger()
|
|
81
|
+
{
|
|
82
|
+
// 冒泡到所有父节点,设置失效子节点字典。
|
|
83
|
+
this._parents.forEach((version, parent) =>
|
|
84
|
+
{
|
|
85
|
+
if (parent._version !== version) return;
|
|
86
|
+
|
|
87
|
+
parent.trigger();
|
|
88
|
+
// 失效时添加子节点到父节点中。
|
|
89
|
+
parent._children.set(this, this._value);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
//
|
|
93
|
+
this._parents.clear();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 当前正在执行的反应式节点。
|
|
98
|
+
*
|
|
99
|
+
* 用于在依赖收集过程中标识当前正在执行的节点。
|
|
100
|
+
* 当其他节点访问此节点的值时,会将其作为父节点。
|
|
101
|
+
*
|
|
102
|
+
* @internal
|
|
103
|
+
*/
|
|
104
|
+
static activeReactivity: ComputedReactivity;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* 反应式节点链。
|
|
109
|
+
*
|
|
110
|
+
* 用于表示响应式节点之间的依赖关系链。
|
|
111
|
+
* 每个节点包含:
|
|
112
|
+
* 1. 节点本身
|
|
113
|
+
* 2. 节点的值
|
|
114
|
+
* 3. 下一个节点的引用
|
|
115
|
+
*/
|
|
116
|
+
export type ReactivityLink = { node: Reactivity, value: any, next: ReactivityLink };
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 强制跟踪依赖。
|
|
120
|
+
*
|
|
121
|
+
* 在函数执行期间强制启用依赖跟踪。
|
|
122
|
+
* 即使当前处于不跟踪状态,也会建立依赖关系。
|
|
123
|
+
*
|
|
124
|
+
* @param fn 要执行的函数
|
|
125
|
+
* @returns 函数的执行结果
|
|
126
|
+
*/
|
|
127
|
+
export function forceTrack<T>(fn: () => T): T
|
|
128
|
+
{
|
|
129
|
+
const preShouldTrack = _shouldTrack;
|
|
130
|
+
|
|
131
|
+
_shouldTrack = true;
|
|
132
|
+
const result = fn();
|
|
133
|
+
|
|
134
|
+
_shouldTrack = preShouldTrack;
|
|
135
|
+
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 禁用依赖跟踪。
|
|
141
|
+
*
|
|
142
|
+
* 在函数执行期间禁用依赖跟踪。
|
|
143
|
+
* 即使当前处于跟踪状态,也不会建立依赖关系。
|
|
144
|
+
*
|
|
145
|
+
* @param fn 要执行的函数
|
|
146
|
+
* @returns 函数的执行结果
|
|
147
|
+
*/
|
|
148
|
+
export function noTrack<T>(fn: () => T): T
|
|
149
|
+
{
|
|
150
|
+
const preShouldTrack = _shouldTrack;
|
|
151
|
+
|
|
152
|
+
_shouldTrack = false;
|
|
153
|
+
const result = fn();
|
|
154
|
+
|
|
155
|
+
_shouldTrack = preShouldTrack;
|
|
156
|
+
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* 是否应该跟踪依赖的标志。
|
|
162
|
+
*
|
|
163
|
+
* 控制是否进行依赖跟踪。
|
|
164
|
+
* 可以通过 forceTrack 和 noTrack 函数临时修改此值。
|
|
165
|
+
*
|
|
166
|
+
* @private
|
|
167
|
+
*/
|
|
168
|
+
let _shouldTrack = true;
|