]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): Map.set should trigger when adding new entry with undefined value...
authorCr <631807682@qq.com>
Wed, 23 Oct 2019 15:00:55 +0000 (23:00 +0800)
committerEvan You <yyx990803@gmail.com>
Wed, 23 Oct 2019 15:00:55 +0000 (11:00 -0400)
packages/reactivity/__tests__/collections/Map.spec.ts
packages/reactivity/__tests__/collections/WeakMap.spec.ts
packages/reactivity/src/collectionHandlers.ts

index 2810f2c40b73630b3fcae2619199a4d3573d97ba..0ae0965bb1e704187dad6ff7e229f481f7f40125 100644 (file)
@@ -185,21 +185,24 @@ describe('reactivity/collections', () => {
 
       expect(dummy).toBe(undefined)
       expect(mapSpy).toHaveBeenCalledTimes(1)
+      map.set('key', undefined)
+      expect(dummy).toBe(undefined)
+      expect(mapSpy).toHaveBeenCalledTimes(2)
       map.set('key', 'value')
       expect(dummy).toBe('value')
-      expect(mapSpy).toHaveBeenCalledTimes(2)
+      expect(mapSpy).toHaveBeenCalledTimes(3)
       map.set('key', 'value')
       expect(dummy).toBe('value')
-      expect(mapSpy).toHaveBeenCalledTimes(2)
+      expect(mapSpy).toHaveBeenCalledTimes(3)
       map.delete('key')
       expect(dummy).toBe(undefined)
-      expect(mapSpy).toHaveBeenCalledTimes(3)
+      expect(mapSpy).toHaveBeenCalledTimes(4)
       map.delete('key')
       expect(dummy).toBe(undefined)
-      expect(mapSpy).toHaveBeenCalledTimes(3)
+      expect(mapSpy).toHaveBeenCalledTimes(4)
       map.clear()
       expect(dummy).toBe(undefined)
-      expect(mapSpy).toHaveBeenCalledTimes(3)
+      expect(mapSpy).toHaveBeenCalledTimes(4)
     })
 
     it('should not observe raw data', () => {
index 57b9669f4010814aa32faa7ab75e2ecd264931ce..01e729569bdaead75f4a4edb13ed98654aa17e73 100644 (file)
@@ -46,18 +46,21 @@ describe('reactivity/collections', () => {
 
       expect(dummy).toBe(undefined)
       expect(mapSpy).toHaveBeenCalledTimes(1)
+      map.set(key, undefined)
+      expect(dummy).toBe(undefined)
+      expect(mapSpy).toHaveBeenCalledTimes(2)
       map.set(key, 'value')
       expect(dummy).toBe('value')
-      expect(mapSpy).toHaveBeenCalledTimes(2)
+      expect(mapSpy).toHaveBeenCalledTimes(3)
       map.set(key, 'value')
       expect(dummy).toBe('value')
-      expect(mapSpy).toHaveBeenCalledTimes(2)
+      expect(mapSpy).toHaveBeenCalledTimes(3)
       map.delete(key)
       expect(dummy).toBe(undefined)
-      expect(mapSpy).toHaveBeenCalledTimes(3)
+      expect(mapSpy).toHaveBeenCalledTimes(4)
       map.delete(key)
       expect(dummy).toBe(undefined)
-      expect(mapSpy).toHaveBeenCalledTimes(3)
+      expect(mapSpy).toHaveBeenCalledTimes(4)
     })
 
     it('should not observe raw data', () => {
index fc721d76e5dad817669ce18639a108fc8b742524..7f208583ef80bebac7336514713de266c9f368fa 100644 (file)
@@ -68,21 +68,19 @@ function set(this: MapTypes, key: unknown, value: unknown) {
   const hadKey = proto.has.call(target, key)
   const oldValue = proto.get.call(target, key)
   const result = proto.set.call(target, key, value)
-  if (value !== oldValue) {
-    /* istanbul ignore else */
-    if (__DEV__) {
-      const extraInfo = { oldValue, newValue: value }
-      if (!hadKey) {
-        trigger(target, OperationTypes.ADD, key, extraInfo)
-      } else {
-        trigger(target, OperationTypes.SET, key, extraInfo)
-      }
-    } else {
-      if (!hadKey) {
-        trigger(target, OperationTypes.ADD, key)
-      } else {
-        trigger(target, OperationTypes.SET, key)
-      }
+  /* istanbul ignore else */
+  if (__DEV__) {
+    const extraInfo = { oldValue, newValue: value }
+    if (!hadKey) {
+      trigger(target, OperationTypes.ADD, key, extraInfo)
+    } else if (value !== oldValue) {
+      trigger(target, OperationTypes.SET, key, extraInfo)
+    }
+  } else {
+    if (!hadKey) {
+      trigger(target, OperationTypes.ADD, key)
+    } else if (value !== oldValue) {
+      trigger(target, OperationTypes.SET, key)
     }
   }
   return result