]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
test: fix deep watch for Map/Set
authorEvan You <yyx990803@gmail.com>
Tue, 27 Aug 2019 19:01:01 +0000 (15:01 -0400)
committerEvan You <yyx990803@gmail.com>
Tue, 27 Aug 2019 19:01:01 +0000 (15:01 -0400)
packages/runtime-core/__tests__/apiWatch.spec.ts
packages/runtime-core/src/apiWatch.ts

index 263864dfdcac33147c492ac1f734b1beeb88da5e..d8854f0a510798e783e115528fd50634a7bbca6e 100644 (file)
@@ -261,34 +261,45 @@ describe('api: watch', () => {
         count: ref(0)
       },
       array: [1, 2, 3],
-      map: new Map([['a', 1], ['b', 2]])
+      map: new Map([['a', 1], ['b', 2]]),
+      set: new Set([1, 2, 3])
     })
 
     let dummy
     watch(
       () => state,
       state => {
-        dummy = [state.nested.count, state.array[0], state.map.get('a')]
+        dummy = [
+          state.nested.count,
+          state.array[0],
+          state.map.get('a'),
+          state.set.has(1)
+        ]
       },
       { deep: true }
     )
 
     await nextTick()
-    expect(dummy).toEqual([0, 1, 1])
+    expect(dummy).toEqual([0, 1, 1, true])
 
     state.nested.count++
     await nextTick()
-    expect(dummy).toEqual([1, 1, 1])
+    expect(dummy).toEqual([1, 1, 1, true])
 
     // nested array mutation
     state.array[0] = 2
     await nextTick()
-    expect(dummy).toEqual([1, 2, 1])
+    expect(dummy).toEqual([1, 2, 1, true])
 
     // nested map mutation
     state.map.set('a', 2)
     await nextTick()
-    expect(dummy).toEqual([1, 2, 2])
+    expect(dummy).toEqual([1, 2, 2, true])
+
+    // nested set mutation
+    state.set.delete(1)
+    await nextTick()
+    expect(dummy).toEqual([1, 2, 2, false])
   })
 
   it('lazy', async () => {
index 943011f0fea72a7b5b3ffb3581efbea456499208..1a956c7344e1f922338482920aa16f7521d5727f 100644 (file)
@@ -164,7 +164,12 @@ function traverse(value: any, seen: Set<any> = new Set()) {
     for (let i = 0; i < value.length; i++) {
       traverse(value[i], seen)
     }
-  } else if (value instanceof Map || value instanceof Set) {
+  } else if (value instanceof Map) {
+    ;(value as any).forEach((v: any, key: any) => {
+      // to register mutation dep for existing keys
+      traverse(value.get(key), seen)
+    })
+  } else if (value instanceof Set) {
     ;(value as any).forEach((v: any) => {
       traverse(v, seen)
     })