Skip to content

Commit 06ed5c5

Browse files
committed
refactor: simplify traverse() for deep watchers
vuejs/core#10795
1 parent c00fd04 commit 06ed5c5

File tree

1 file changed

+8
-15
lines changed

1 file changed

+8
-15
lines changed

packages/core/src/watch.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -378,43 +378,36 @@ function doWatch(
378378

379379
function traverse(
380380
value: unknown,
381-
depth?: number,
382-
currentDepth = 0,
381+
depth = Number.POSITIVE_INFINITY,
383382
seen?: Set<unknown>,
384383
): unknown {
385-
if (!isObject(value) || (value as any)[ReactiveFlags.SKIP]) {
384+
if (depth <= 0 || !isObject(value) || (value as any)[ReactiveFlags.SKIP]) {
386385
return value
387386
}
388387

389-
if (depth && depth > 0) {
390-
if (currentDepth >= depth) {
391-
return value
392-
}
393-
394-
currentDepth++
395-
}
396-
397388
seen = seen || new Set()
398389
if (seen.has(value)) {
399390
return value
400391
}
401392

402393
seen.add(value)
394+
depth--
395+
403396
/* istanbul ignore else -- @preserve */
404397
if (isRef(value)) {
405-
traverse(value.value, depth, currentDepth, seen)
398+
traverse(value.value, depth, seen)
406399
} else if (isArray(value)) {
407400
for (let i = 0; i < value.length; i++) {
408-
traverse(value[i], depth, currentDepth, seen)
401+
traverse(value[i], depth, seen)
409402
}
410403
} else if (isSet(value) || isMap(value)) {
411404
value.forEach((v: any) => {
412-
traverse(v, depth, currentDepth, seen)
405+
traverse(v, depth, seen)
413406
})
414407
} else if (isPlainObject(value)) {
415408
// eslint-disable-next-line guard-for-in
416409
for (const key in value) {
417-
traverse(value[key], depth, currentDepth, seen)
410+
traverse(value[key], depth, seen)
418411
}
419412
}
420413

0 commit comments

Comments
 (0)