]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: simplify traverse() for deep watchers (#10795)
authorskirtle <65301168+skirtles-code@users.noreply.github.com>
Mon, 29 Apr 2024 06:29:55 +0000 (07:29 +0100)
committerGitHub <noreply@github.com>
Mon, 29 Apr 2024 06:29:55 +0000 (14:29 +0800)
packages/runtime-core/src/apiWatch.ts

index bc10547824e2403c70832d1f63b56e26454a905c..0fd6b050cfa02f96b6cde34ffadc6efadab31578 100644 (file)
@@ -466,39 +466,32 @@ export function createPathGetter(ctx: any, path: string) {
 
 export function traverse(
   value: unknown,
-  depth?: number,
-  currentDepth = 0,
+  depth = Infinity,
   seen?: Set<unknown>,
 ) {
-  if (!isObject(value) || (value as any)[ReactiveFlags.SKIP]) {
+  if (depth <= 0 || !isObject(value) || (value as any)[ReactiveFlags.SKIP]) {
     return value
   }
 
-  if (depth && depth > 0) {
-    if (currentDepth >= depth) {
-      return value
-    }
-    currentDepth++
-  }
-
   seen = seen || new Set()
   if (seen.has(value)) {
     return value
   }
   seen.add(value)
+  depth--
   if (isRef(value)) {
-    traverse(value.value, depth, currentDepth, seen)
+    traverse(value.value, depth, seen)
   } else if (isArray(value)) {
     for (let i = 0; i < value.length; i++) {
-      traverse(value[i], depth, currentDepth, seen)
+      traverse(value[i], depth, seen)
     }
   } else if (isSet(value) || isMap(value)) {
     value.forEach((v: any) => {
-      traverse(v, depth, currentDepth, seen)
+      traverse(v, depth, seen)
     })
   } else if (isPlainObject(value)) {
     for (const key in value) {
-      traverse(value[key], depth, currentDepth, seen)
+      traverse(value[key], depth, seen)
     }
   }
   return value