]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): should delete observe value (#598)
authorlikui <2218301630@qq.com>
Mon, 13 Jan 2020 22:11:49 +0000 (06:11 +0800)
committerEvan You <yyx990803@gmail.com>
Mon, 13 Jan 2020 22:11:49 +0000 (17:11 -0500)
fix #597

packages/reactivity/__tests__/collections/Map.spec.ts
packages/reactivity/__tests__/collections/Set.spec.ts
packages/reactivity/__tests__/collections/WeakMap.spec.ts
packages/reactivity/__tests__/collections/WeakSet.spec.ts
packages/reactivity/src/collectionHandlers.ts

index b190da32fce513e5b709f95669b2a16e711768ce..4cfb9e6bbcd1a516bdcdd78a2bcb49d4badd7a75 100644 (file)
@@ -26,6 +26,22 @@ describe('reactivity/collections', () => {
       expect(dummy).toBe(undefined)
     })
 
+    it('should observe mutations with observed value as key', () => {
+      let dummy
+      const key = reactive({})
+      const value = reactive({})
+      const map = reactive(new Map())
+      effect(() => {
+        dummy = map.get(key)
+      })
+
+      expect(dummy).toBe(undefined)
+      map.set(key, value)
+      expect(dummy).toBe(value)
+      map.delete(key)
+      expect(dummy).toBe(undefined)
+    })
+
     it('should observe size mutations', () => {
       let dummy
       const map = reactive(new Map())
index f01090d2f5457e7157927d41196525564945b2be..9e3efa166f1fe47fa96f0e90b2ac6e01f4e82f28 100644 (file)
@@ -22,6 +22,19 @@ describe('reactivity/collections', () => {
       expect(dummy).toBe(false)
     })
 
+    it('should observe mutations with observed value', () => {
+      let dummy
+      const value = reactive({})
+      const set = reactive(new Set())
+      effect(() => (dummy = set.has(value)))
+
+      expect(dummy).toBe(false)
+      set.add(value)
+      expect(dummy).toBe(true)
+      set.delete(value)
+      expect(dummy).toBe(false)
+    })
+
     it('should observe for of iteration', () => {
       let dummy
       const set = reactive(new Set() as Set<number>)
index 6c82b82dd867d9837d70250d14fbe08437ed99e8..e3dde72e618a22cf155dc3f8173952b30b6a2a81 100644 (file)
@@ -27,6 +27,22 @@ describe('reactivity/collections', () => {
       expect(dummy).toBe(undefined)
     })
 
+    it('should observe mutations with observed value as key', () => {
+      let dummy
+      const key = reactive({})
+      const value = reactive({})
+      const map = reactive(new WeakMap())
+      effect(() => {
+        dummy = map.get(key)
+      })
+
+      expect(dummy).toBe(undefined)
+      map.set(key, value)
+      expect(dummy).toBe(value)
+      map.delete(key)
+      expect(dummy).toBe(undefined)
+    })
+
     it('should not observe custom property mutations', () => {
       let dummy
       const map: any = reactive(new WeakMap())
index 2427de125e5ba812287611fd64716e45e8881e5a..182298cf4b0efebe0ecb635b4ef8affc8f1e3a69 100644 (file)
@@ -23,6 +23,19 @@ describe('reactivity/collections', () => {
       expect(dummy).toBe(false)
     })
 
+    it('should observe mutations with observed value', () => {
+      let dummy
+      const value = reactive({})
+      const set = reactive(new WeakSet())
+      effect(() => (dummy = set.has(value)))
+
+      expect(dummy).toBe(false)
+      set.add(value)
+      expect(dummy).toBe(true)
+      set.delete(value)
+      expect(dummy).toBe(false)
+    })
+
     it('should not observe custom property mutations', () => {
       let dummy
       const set: any = reactive(new WeakSet())
index b5289844089a409ab8e738ef542d469c09b6e90f..cb90cf0e3c2b41de9219a61b984635069a2d2b8f 100644 (file)
@@ -63,6 +63,7 @@ function add(this: SetTypes, value: unknown) {
 
 function set(this: MapTypes, key: unknown, value: unknown) {
   value = toRaw(value)
+  key = toRaw(key)
   const target = toRaw(this)
   const proto = getProto(target)
   const hadKey = proto.has.call(target, key)
@@ -87,6 +88,7 @@ function set(this: MapTypes, key: unknown, value: unknown) {
 }
 
 function deleteEntry(this: CollectionTypes, key: unknown) {
+  key = toRaw(key)
   const target = toRaw(this)
   const proto = getProto(target)
   const hadKey = proto.has.call(target, key)