@@ -118,25 +118,38 @@ export function track(
118
118
type : OperationTypes ,
119
119
key ?: string | symbol
120
120
) {
121
+ //全局的一个锁控制是否依赖收集
121
122
if ( ! shouldTrack ) {
122
123
return
123
124
}
125
+ //当前活动的effect,类似于老版本的watcher, render就是一个watcher,这里render,computed等都是effect
124
126
const effect = activeReactiveEffectStack [ activeReactiveEffectStack . length - 1 ]
125
127
if ( effect ) {
128
+ //这个只有当调用的是set和map等特殊数据结构的'keys', 'values', 'entries‘等方法时候,type才会为iterate。
129
+ //其实我们所有依赖的储存都是map的形式。key是你get的key,value就是依赖数组,比如你读obj.a 那么key就是a,value就是
130
+ //所有读obj.a的依赖,按理我们调用keys,values,entries等的时候 key应该是不同的值,但是事实上这些key对应的依赖都应该
131
+ //是同步更新,也就是说调用keys的依赖更新,调用values的依赖也必须更新。所以这里将他们都拿一个值存储
132
+ //这里的type一般是add,del等等,当调用'keys', 'values', 'entries‘的时候是iterate
126
133
if ( type === OperationTypes . ITERATE ) {
127
134
key = ITERATE_KEY
128
135
}
136
+ //targetMap存储的key是对象,value也是一个map,下面会解释这个map上面东西
129
137
let depsMap = targetMap . get ( target )
138
+ //没有的话,新建一个map
130
139
if ( depsMap === void 0 ) {
131
140
targetMap . set ( target , ( depsMap = new Map ( ) ) )
132
141
}
142
+ //depsmap的key是调用的key值,value是一个set。储存所有的依赖,
133
143
let dep = depsMap . get ( key as string | symbol )
144
+ //没有的话,新建一个set,所以就算访问不存在的属性,也会将依赖收集。
134
145
if ( ! dep ) {
135
146
depsMap . set ( key as string | symbol , ( dep = new Set ( ) ) )
136
147
}
148
+ //收集依赖。
137
149
if ( ! dep . has ( effect ) ) {
138
- dep . add ( effect )
139
- effect . deps . push ( dep )
150
+ dep . add ( effect ) //这里是依赖收集
151
+ effect . deps . push ( dep ) //因为依赖也有个deps数组,将当前属性值所有的依赖存入正在收集的依赖中。computed的时候要用,到时会就懂为什么这里收集
152
+ //开发环境追踪,
140
153
if ( __DEV__ && effect . onTrack ) {
141
154
effect . onTrack ( {
142
155
effect,
@@ -155,34 +168,40 @@ export function trigger(
155
168
key ?: string | symbol ,
156
169
extraInfo ?: any
157
170
) {
171
+ //拿到target的所有的依赖map(key是对象的各个属性,value是依赖)
158
172
const depsMap = targetMap . get ( target )
159
173
if ( depsMap === void 0 ) {
160
174
// never been tracked
161
175
return
162
176
}
177
+ //储存一般的effect
163
178
const effects : Set < ReactiveEffect > = new Set ( )
179
+ //储存computed生成的effect
164
180
const computedRunners : Set < ReactiveEffect > = new Set ( )
181
+ //当type为clear时候,所有属性的依赖都要更新,因为所有属性都被清空
165
182
if ( type === OperationTypes . CLEAR ) {
166
- // collection being cleared, trigger all effects for target
167
183
depsMap . forEach ( dep => {
184
+ //添加依赖
168
185
addRunners ( effects , computedRunners , dep )
169
186
} )
170
187
} else {
171
- // schedule runs for SET | ADD | DELETE
188
+ //添加依赖
172
189
if ( key !== void 0 ) {
173
190
addRunners ( effects , computedRunners , depsMap . get ( key as string | symbol ) )
174
191
}
175
- // also run for iteration key on ADD | DELETE
192
+ //当数组的时候触发更新, add和delete都会引起length的变化,所以判断是数组且更新类型是add和delete的时候,额外更新调用了属性lengrh的依赖。
193
+ //当不为数组且是add或者delete的时候,更新key为iterate的依赖,这时候有可能是set和map等特殊类型,因为更新类型是add和delete的时候。
194
+ //他们的size,keys等等属性的依赖都需要跟着变化
176
195
if ( type === OperationTypes . ADD || type === OperationTypes . DELETE ) {
177
196
const iterationKey = Array . isArray ( target ) ? 'length' : ITERATE_KEY
178
197
addRunners ( effects , computedRunners , depsMap . get ( iterationKey ) )
179
198
}
180
199
}
200
+ //运行依赖
181
201
const run = ( effect : ReactiveEffect ) => {
182
202
scheduleRun ( effect , target , type , key , extraInfo )
183
203
}
184
- // Important: computed effects must be run first so that computed getters
185
- // can be invalidated before any normal effects that depend on them are run.
204
+ //注意这里先运行computed生成的依赖,然后在运行普通的依赖,因为普通的依赖有可能需要读取computed的新值
186
205
computedRunners . forEach ( run )
187
206
effects . forEach ( run )
188
207
}
@@ -203,6 +222,7 @@ function addRunners(
203
222
}
204
223
}
205
224
225
+ //批量更新依赖
206
226
function scheduleRun (
207
227
effect : ReactiveEffect ,
208
228
target : any ,
@@ -223,6 +243,7 @@ function scheduleRun(
223
243
)
224
244
)
225
245
}
246
+
226
247
if ( effect . scheduler !== void 0 ) {
227
248
effect . scheduler ( effect )
228
249
} else {
0 commit comments