diff --git a/packages/runtime-core/__tests__/apiWatch.spec.ts b/packages/runtime-core/__tests__/apiWatch.spec.ts index f42640abc4d..8b58ded3903 100644 --- a/packages/runtime-core/__tests__/apiWatch.spec.ts +++ b/packages/runtime-core/__tests__/apiWatch.spec.ts @@ -86,6 +86,23 @@ describe('api: watch', () => { expect(dummy).toMatchObject([2, 1]) }) + it('watching primitive with deep: true', async () => { + const count = ref(0) + let dummy + watch( + count, + (c, prevCount) => { + dummy = [c, prevCount] + }, + { + deep: true + } + ) + count.value++ + await nextTick() + expect(dummy).toMatchObject([1, 0]) + }) + it('watching multiple sources', async () => { const state = reactive({ count: 1 }) const count = ref(1) diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index ff3e7c6257e..1c02c115e93 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -286,6 +286,9 @@ export function instanceWatch( function traverse(value: unknown, seen: Set = new Set()) { if (!isObject(value) || seen.has(value)) { + return value + } + if (seen.has(value)) { return } seen.add(value)