diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 7a5e5c4..23a92b3 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -1,4 +1,4 @@ -import { EMPTY_OBJ, hasChanged } from '@vue/shared' +import { EMPTY_OBJ, hasChanged, isObject } from '@vue/shared' import { isReactive, ReactiveEffect } from '@vue/reactivity' import { queuePreFlushCb } from '@vue/runtime-core' @@ -28,7 +28,8 @@ function doWatch( //todo //浅拷贝的形式--指向同样的内存空间 const baseGetter = getter - getter = () => baseGetter() + //等同于将source的属性传进去了 + getter = () => traverse(baseGetter()) } let oldValue = {} @@ -58,3 +59,17 @@ function doWatch( effect.stop() } } + +/** + * 本质上是拿value, 出发一次getter行为 + * @param value + */ +export function traverse(value: unknown) { + if (!isObject(value)) { + return value + } + for (const key in value as object) { + traverse((value as object)[key]) + } + return value +}