Skip to content

Commit f80d447

Browse files
authoredSep 10, 2024··
perf(reactivity): trigger deps directly instead of storing in an array first (#11695)
1 parent ced59ab commit f80d447

File tree

1 file changed

+29
-28
lines changed

1 file changed

+29
-28
lines changed
 

‎packages/reactivity/src/dep.ts

+29-28
Original file line numberDiff line numberDiff line change
@@ -250,11 +250,29 @@ export function trigger(
250250
return
251251
}
252252

253-
let deps: Dep[] = []
253+
const run = (dep: Dep | undefined) => {
254+
if (dep) {
255+
if (__DEV__) {
256+
dep.trigger({
257+
target,
258+
type,
259+
key,
260+
newValue,
261+
oldValue,
262+
oldTarget,
263+
})
264+
} else {
265+
dep.trigger()
266+
}
267+
}
268+
}
269+
270+
startBatch()
271+
254272
if (type === TriggerOpTypes.CLEAR) {
255273
// collection being cleared
256274
// trigger all effects for target
257-
deps = [...depsMap.values()]
275+
depsMap.forEach(run)
258276
} else {
259277
const targetIsArray = isArray(target)
260278
const isArrayIndex = targetIsArray && isIntegerKey(key)
@@ -267,67 +285,50 @@ export function trigger(
267285
key === ARRAY_ITERATE_KEY ||
268286
(!isSymbol(key) && key >= newLength)
269287
) {
270-
deps.push(dep)
288+
run(dep)
271289
}
272290
})
273291
} else {
274-
const push = (dep: Dep | undefined) => dep && deps.push(dep)
275-
276292
// schedule runs for SET | ADD | DELETE
277293
if (key !== void 0) {
278-
push(depsMap.get(key))
294+
run(depsMap.get(key))
279295
}
280296

281297
// schedule ARRAY_ITERATE for any numeric key change (length is handled above)
282298
if (isArrayIndex) {
283-
push(depsMap.get(ARRAY_ITERATE_KEY))
299+
run(depsMap.get(ARRAY_ITERATE_KEY))
284300
}
285301

286302
// also run for iteration key on ADD | DELETE | Map.SET
287303
switch (type) {
288304
case TriggerOpTypes.ADD:
289305
if (!targetIsArray) {
290-
push(depsMap.get(ITERATE_KEY))
306+
run(depsMap.get(ITERATE_KEY))
291307
if (isMap(target)) {
292-
push(depsMap.get(MAP_KEY_ITERATE_KEY))
308+
run(depsMap.get(MAP_KEY_ITERATE_KEY))
293309
}
294310
} else if (isArrayIndex) {
295311
// new index added to array -> length changes
296-
push(depsMap.get('length'))
312+
run(depsMap.get('length'))
297313
}
298314
break
299315
case TriggerOpTypes.DELETE:
300316
if (!targetIsArray) {
301-
push(depsMap.get(ITERATE_KEY))
317+
run(depsMap.get(ITERATE_KEY))
302318
if (isMap(target)) {
303-
push(depsMap.get(MAP_KEY_ITERATE_KEY))
319+
run(depsMap.get(MAP_KEY_ITERATE_KEY))
304320
}
305321
}
306322
break
307323
case TriggerOpTypes.SET:
308324
if (isMap(target)) {
309-
push(depsMap.get(ITERATE_KEY))
325+
run(depsMap.get(ITERATE_KEY))
310326
}
311327
break
312328
}
313329
}
314330
}
315331

316-
startBatch()
317-
for (const dep of deps) {
318-
if (__DEV__) {
319-
dep.trigger({
320-
target,
321-
type,
322-
key,
323-
newValue,
324-
oldValue,
325-
oldTarget,
326-
})
327-
} else {
328-
dep.trigger()
329-
}
330-
}
331332
endBatch()
332333
}
333334

0 commit comments

Comments
 (0)
Please sign in to comment.