Skip to content

Commit 10293c7

Browse files
authored
fix(watch): traverse refs in deep watch (#1939)
ref #1900
1 parent 31b99a9 commit 10293c7

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

packages/runtime-core/__tests__/apiWatch.spec.ts

+19
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,25 @@ describe('api: watch', () => {
574574
expect(dummy).toEqual([1, 2, 2, false])
575575
})
576576

577+
it('watching deep ref', async () => {
578+
const count = ref(0)
579+
const double = computed(() => count.value * 2)
580+
const state = reactive([count, double])
581+
582+
let dummy
583+
watch(
584+
() => state,
585+
state => {
586+
dummy = [state[0].value, state[1].value]
587+
},
588+
{ deep: true }
589+
)
590+
591+
count.value++
592+
await nextTick()
593+
expect(dummy).toEqual([1, 2])
594+
})
595+
577596
it('immediate', async () => {
578597
const count = ref(0)
579598
const cb = jest.fn()

packages/runtime-core/src/apiWatch.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ function traverse(value: unknown, seen: Set<unknown> = new Set()) {
329329
return value
330330
}
331331
seen.add(value)
332-
if (isArray(value)) {
332+
if (isRef(value)) {
333+
traverse(value.value, seen)
334+
} else if (isArray(value)) {
333335
for (let i = 0; i < value.length; i++) {
334336
traverse(value[i], seen)
335337
}

0 commit comments

Comments
 (0)