1
1
import { TrackOpTypes , TriggerOpTypes } from './operations'
2
- import { EMPTY_OBJ , isArray , isIntegerKey , isMap } from '@vue/shared'
2
+ import { EMPTY_OBJ , extend , isArray , isIntegerKey , isMap } from '@vue/shared'
3
3
4
4
// The main WeakMap that stores {target -> key -> dep} connections.
5
5
// Conceptually, it's easier to think of a dependency as a Dep class
@@ -212,47 +212,47 @@ export function trigger(
212
212
return
213
213
}
214
214
215
- let sets : DepSets = [ ]
215
+ let deps : ( Dep | undefined ) [ ] = [ ]
216
216
if ( type === TriggerOpTypes . CLEAR ) {
217
217
// collection being cleared
218
218
// trigger all effects for target
219
- sets = [ ...depsMap . values ( ) ]
219
+ deps = [ ...depsMap . values ( ) ]
220
220
} else if ( key === 'length' && isArray ( target ) ) {
221
221
depsMap . forEach ( ( dep , key ) => {
222
222
if ( key === 'length' || key >= ( newValue as number ) ) {
223
- sets . push ( dep )
223
+ deps . push ( dep )
224
224
}
225
225
} )
226
226
} else {
227
227
// schedule runs for SET | ADD | DELETE
228
228
if ( key !== void 0 ) {
229
- sets . push ( depsMap . get ( key ) )
229
+ deps . push ( depsMap . get ( key ) )
230
230
}
231
231
232
232
// also run for iteration key on ADD | DELETE | Map.SET
233
233
switch ( type ) {
234
234
case TriggerOpTypes . ADD :
235
235
if ( ! isArray ( target ) ) {
236
- sets . push ( depsMap . get ( ITERATE_KEY ) )
236
+ deps . push ( depsMap . get ( ITERATE_KEY ) )
237
237
if ( isMap ( target ) ) {
238
- sets . push ( depsMap . get ( MAP_KEY_ITERATE_KEY ) )
238
+ deps . push ( depsMap . get ( MAP_KEY_ITERATE_KEY ) )
239
239
}
240
240
} else if ( isIntegerKey ( key ) ) {
241
241
// new index added to array -> length changes
242
- sets . push ( depsMap . get ( 'length' ) )
242
+ deps . push ( depsMap . get ( 'length' ) )
243
243
}
244
244
break
245
245
case TriggerOpTypes . DELETE :
246
246
if ( ! isArray ( target ) ) {
247
- sets . push ( depsMap . get ( ITERATE_KEY ) )
247
+ deps . push ( depsMap . get ( ITERATE_KEY ) )
248
248
if ( isMap ( target ) ) {
249
- sets . push ( depsMap . get ( MAP_KEY_ITERATE_KEY ) )
249
+ deps . push ( depsMap . get ( MAP_KEY_ITERATE_KEY ) )
250
250
}
251
251
}
252
252
break
253
253
case TriggerOpTypes . SET :
254
254
if ( isMap ( target ) ) {
255
- sets . push ( depsMap . get ( ITERATE_KEY ) )
255
+ deps . push ( depsMap . get ( ITERATE_KEY ) )
256
256
}
257
257
break
258
258
}
@@ -261,51 +261,37 @@ export function trigger(
261
261
const eventInfo = __DEV__
262
262
? { target, type, key, newValue, oldValue, oldTarget }
263
263
: undefined
264
- triggerMultiEffects ( sets , eventInfo )
265
- }
266
-
267
- type DepSets = ( Dep | undefined ) [ ]
268
264
269
- export function triggerMultiEffects (
270
- depSets : DepSets ,
271
- debuggerEventExtraInfo ?: DebuggerEventExtraInfo
272
- ) {
273
- if ( depSets . length === 1 ) {
274
- if ( depSets [ 0 ] ) {
275
- triggerEffects ( depSets [ 0 ] , debuggerEventExtraInfo )
265
+ if ( deps . length === 1 ) {
266
+ if ( deps [ 0 ] ) {
267
+ triggerEffects ( deps [ 0 ] , eventInfo )
276
268
}
277
269
} else {
278
- const sets = depSets . filter ( s => ! ! s ) as Dep [ ]
279
- triggerEffects ( concatSets ( sets ) , debuggerEventExtraInfo )
270
+ const effects : ReactiveEffect [ ] = [ ]
271
+ for ( const dep of deps ) {
272
+ if ( dep ) {
273
+ effects . push ( ...dep )
274
+ }
275
+ }
276
+ triggerEffects ( new Set ( effects ) , eventInfo )
280
277
}
281
278
}
282
279
283
- function concatSets < T > ( sets : Set < T > [ ] ) : Set < T > {
284
- const all = ( [ ] as T [ ] ) . concat ( ...sets . map ( s => [ ...s ! ] ) )
285
- return new Set ( all )
286
- }
287
-
288
280
export function triggerEffects (
289
281
dep : Dep ,
290
282
debuggerEventExtraInfo ?: DebuggerEventExtraInfo
291
283
) {
292
- const run = ( effect : ReactiveEffect ) => {
293
- if ( __DEV__ && effect . options . onTrigger ) {
294
- effect . options . onTrigger (
295
- Object . assign ( { effect } , debuggerEventExtraInfo )
296
- )
297
- }
298
- if ( effect . options . scheduler ) {
299
- effect . options . scheduler ( effect )
300
- } else {
301
- effect ( )
302
- }
303
- }
304
-
305
- const immutableDeps = [ ...dep ]
306
- immutableDeps . forEach ( effect => {
284
+ // spread into array for stabilization
285
+ for ( const effect of [ ...dep ] ) {
307
286
if ( effect !== activeEffect || effect . allowRecurse ) {
308
- run ( effect )
287
+ if ( __DEV__ && effect . options . onTrigger ) {
288
+ effect . options . onTrigger ( extend ( { effect } , debuggerEventExtraInfo ) )
289
+ }
290
+ if ( effect . options . scheduler ) {
291
+ effect . options . scheduler ( effect )
292
+ } else {
293
+ effect ( )
294
+ }
309
295
}
310
- } )
296
+ }
311
297
}
0 commit comments