|
|
@@ -231,8 +231,11 @@ function doWatch(
|
|
|
getter = () => source.value
|
|
|
forceTrigger = isShallow(source)
|
|
|
} else if (isReactive(source)) {
|
|
|
- getter = () => source
|
|
|
- deep = true
|
|
|
+ getter =
|
|
|
+ isShallow(source) || deep === false
|
|
|
+ ? () => traverse(source, 1)
|
|
|
+ : () => traverse(source)
|
|
|
+ forceTrigger = true
|
|
|
} else if (isArray(source)) {
|
|
|
isMultiSource = true
|
|
|
forceTrigger = source.some(s => isReactive(s) || isShallow(s))
|
|
|
@@ -241,7 +244,7 @@ function doWatch(
|
|
|
if (isRef(s)) {
|
|
|
return s.value
|
|
|
} else if (isReactive(s)) {
|
|
|
- return traverse(s)
|
|
|
+ return traverse(s, isShallow(s) || deep === false ? 1 : undefined)
|
|
|
} else if (isFunction(s)) {
|
|
|
return callWithErrorHandling(s, instance, ErrorCodes.WATCH_GETTER)
|
|
|
} else {
|
|
|
@@ -460,28 +463,41 @@ export function createPathGetter(ctx: any, path: string) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export function traverse(value: unknown, seen?: Set<unknown>) {
|
|
|
+export function traverse(
|
|
|
+ value: unknown,
|
|
|
+ depth?: number,
|
|
|
+ currentDepth = 0,
|
|
|
+ seen?: Set<unknown>,
|
|
|
+) {
|
|
|
if (!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)
|
|
|
if (isRef(value)) {
|
|
|
- traverse(value.value, seen)
|
|
|
+ traverse(value.value, depth, currentDepth, seen)
|
|
|
} else if (isArray(value)) {
|
|
|
for (let i = 0; i < value.length; i++) {
|
|
|
- traverse(value[i], seen)
|
|
|
+ traverse(value[i], depth, currentDepth, seen)
|
|
|
}
|
|
|
} else if (isSet(value) || isMap(value)) {
|
|
|
value.forEach((v: any) => {
|
|
|
- traverse(v, seen)
|
|
|
+ traverse(v, depth, currentDepth, seen)
|
|
|
})
|
|
|
} else if (isPlainObject(value)) {
|
|
|
for (const key in value) {
|
|
|
- traverse(value[key], seen)
|
|
|
+ traverse(value[key], depth, currentDepth, seen)
|
|
|
}
|
|
|
}
|
|
|
return value
|