]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf(reactivity): avoid triggering Map.has twice on non-reactive keys (#1972)
authorPick <picknight@foxmail.com>
Wed, 26 Aug 2020 15:41:18 +0000 (23:41 +0800)
committerGitHub <noreply@github.com>
Wed, 26 Aug 2020 15:41:18 +0000 (11:41 -0400)
packages/reactivity/__tests__/collections/Map.spec.ts
packages/reactivity/src/collectionHandlers.ts

index 6ee2c81ee4dd8f1ff24fb5cf741504ee5a58131f..5219a9ea3939e9dd2b6ea2b604c7f0946622c6c7 100644 (file)
@@ -436,5 +436,16 @@ describe('reactivity/collections', () => {
       map.set('b', 1)
       expect(spy).toHaveBeenCalledTimes(3)
     })
+
+    it('should trigger has only once for non-reactive keys', () => {
+      const map = new Map()
+      const spy = jest.fn()
+      map.has = spy
+
+      let proxy = reactive(map)
+      proxy.has('k')
+
+      expect(spy).toBeCalledTimes(1)
+    })
   })
 })
index 4f4b97261405c52d8e2358c564008d956cafc51d..24ae1515610187e9e8b9f4b2c500c61224a90d72 100644 (file)
@@ -59,7 +59,9 @@ function has(this: CollectionTypes, key: unknown, isReadonly = false): boolean {
     !isReadonly && track(rawTarget, TrackOpTypes.HAS, key)
   }
   !isReadonly && track(rawTarget, TrackOpTypes.HAS, rawKey)
-  return target.has(key) || target.has(rawKey)
+  return key === rawKey
+    ? target.has(key)
+    : target.has(key) || target.has(rawKey)
 }
 
 function size(target: IterableCollections, isReadonly = false) {