Просмотр исходного кода

fix(watch): fix deep watchers on refs containing primitives (#984)

Carlos Rodrigues 6 лет назад
Родитель
Сommit
99fd158d09

+ 17 - 0
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)

+ 3 - 0
packages/runtime-core/src/apiWatch.ts

@@ -286,6 +286,9 @@ export function instanceWatch(
 
 function traverse(value: unknown, seen: Set<unknown> = new Set()) {
   if (!isObject(value) || seen.has(value)) {
+    return value
+  }
+  if (seen.has(value)) {
     return
   }
   seen.add(value)