]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(watch): traverse refs in deep watch (#1939)
authorYang Mingshan <y.mingshan3@gmail.com>
Sun, 23 Aug 2020 18:41:11 +0000 (02:41 +0800)
committerGitHub <noreply@github.com>
Sun, 23 Aug 2020 18:41:11 +0000 (14:41 -0400)
ref #1900

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

index c315de9713e65ae4e8fdabba8c6a3d0e161c97c8..138a3e04f5d0b57a9b13163a310e992974123fac 100644 (file)
@@ -574,6 +574,25 @@ describe('api: watch', () => {
     expect(dummy).toEqual([1, 2, 2, false])
   })
 
+  it('watching deep ref', async () => {
+    const count = ref(0)
+    const double = computed(() => count.value * 2)
+    const state = reactive([count, double])
+
+    let dummy
+    watch(
+      () => state,
+      state => {
+        dummy = [state[0].value, state[1].value]
+      },
+      { deep: true }
+    )
+
+    count.value++
+    await nextTick()
+    expect(dummy).toEqual([1, 2])
+  })
+
   it('immediate', async () => {
     const count = ref(0)
     const cb = jest.fn()
index ac797b89ea380fa96c30540ae330c5abdee284aa..9c131067feb76f09fcf2ce1e613e650c3031b510 100644 (file)
@@ -329,7 +329,9 @@ function traverse(value: unknown, seen: Set<unknown> = new Set()) {
     return value
   }
   seen.add(value)
-  if (isArray(value)) {
+  if (isRef(value)) {
+    traverse(value.value, seen)
+  } else if (isArray(value)) {
     for (let i = 0; i < value.length; i++) {
       traverse(value[i], seen)
     }