From 01f284184918361f9db1d0bd7aeab65bd0afe9e7 Mon Sep 17 00:00:00 2001 From: daiwei Date: Tue, 17 Nov 2020 12:56:40 +0800 Subject: [PATCH 1/9] fix(reactivity): fix track hasOwnProperty --- packages/reactivity/src/baseHandlers.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index a246b6f3194..39e134a4483 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -98,7 +98,11 @@ function createGetter(isReadonly = false, shallow = false) { } if (!isReadonly) { - track(target, TrackOpTypes.GET, key) + track( + target, + TrackOpTypes.GET, + key === 'hasOwnProperty' ? ITERATE_KEY : key + ) } if (shallow) { From a6ad488aae6cbc5d207a17c8bc307ef3bd7d59a9 Mon Sep 17 00:00:00 2001 From: daiwei Date: Tue, 17 Nov 2020 13:03:18 +0800 Subject: [PATCH 2/9] fix(reactivity): fix track hasOwnProperty --- packages/reactivity/src/baseHandlers.ts | 1 + packages/vue/examples/classic/commits.html | 88 +++++----------------- 2 files changed, 18 insertions(+), 71 deletions(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 39e134a4483..f0b4532832d 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -101,6 +101,7 @@ function createGetter(isReadonly = false, shallow = false) { track( target, TrackOpTypes.GET, + //#2619 key === 'hasOwnProperty' ? ITERATE_KEY : key ) } diff --git a/packages/vue/examples/classic/commits.html b/packages/vue/examples/classic/commits.html index 1a258753874..30359b80960 100644 --- a/packages/vue/examples/classic/commits.html +++ b/packages/vue/examples/classic/commits.html @@ -1,76 +1,22 @@ -
-

Latest Vue.js Commits

- -

vuejs/vue@{{ currentBranch }}

- +
+ {{ obj.hasOwnProperty('a') }} + +
- - + Vue.createApp({ + data() { + debugger + return { + obj: {} + } + } + }).mount('#app') + \ No newline at end of file From ddfa15d36c352e04c7c1ae24e5aa5e938b9ae40a Mon Sep 17 00:00:00 2001 From: daiwei Date: Tue, 17 Nov 2020 13:15:38 +0800 Subject: [PATCH 3/9] fix(reactivity): fix track hasOwnProperty --- packages/reactivity/src/baseHandlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index f0b4532832d..7b8c2589e05 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -101,7 +101,7 @@ function createGetter(isReadonly = false, shallow = false) { track( target, TrackOpTypes.GET, - //#2619 + //f #2619 key === 'hasOwnProperty' ? ITERATE_KEY : key ) } From e1a9d4253ee912138b078d70bbbfec51e9f981cc Mon Sep 17 00:00:00 2001 From: daiwei Date: Tue, 17 Nov 2020 13:15:50 +0800 Subject: [PATCH 4/9] fix(reactivity): fix track hasOwnProperty --- packages/reactivity/src/baseHandlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 7b8c2589e05..708550eaccb 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -101,7 +101,7 @@ function createGetter(isReadonly = false, shallow = false) { track( target, TrackOpTypes.GET, - //f #2619 + // #2619 key === 'hasOwnProperty' ? ITERATE_KEY : key ) } From 3b6e445d76a0f5a23dd4a6844343868b7cde59df Mon Sep 17 00:00:00 2001 From: daiwei Date: Tue, 17 Nov 2020 13:16:27 +0800 Subject: [PATCH 5/9] fix(reactivity): fix track hasOwnProperty --- packages/vue/examples/classic/commits.html | 88 +++++++++++++++++----- 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/packages/vue/examples/classic/commits.html b/packages/vue/examples/classic/commits.html index 30359b80960..1a258753874 100644 --- a/packages/vue/examples/classic/commits.html +++ b/packages/vue/examples/classic/commits.html @@ -1,22 +1,76 @@ -
- {{ obj.hasOwnProperty('a') }} - - +
+

Latest Vue.js Commits

+ +

vuejs/vue@{{ currentBranch }}

+
\ No newline at end of file +const API_URL = `https://api.github.com/repos/vuejs/vue-next/commits?per_page=3&sha=` + +Vue.createApp({ + data: () => ({ + branches: ['master', 'sync'], + currentBranch: 'master', + commits: null + }), + + created() { + this.fetchData() + }, + + watch: { + currentBranch: 'fetchData' + }, + + methods: { + fetchData() { + fetch(`${API_URL}${this.currentBranch}`) + .then(res => res.json()) + .then(data => { + this.commits = data + }) + }, + truncate(v) { + const newline = v.indexOf('\n') + return newline > 0 ? v.slice(0, newline) : v + }, + formatDate(v) { + return v.replace(/T|Z/g, ' ') + } + } +}).mount('#demo') + + + From 58fb020888ae064cccfb2d511442f09498c33ea5 Mon Sep 17 00:00:00 2001 From: daiwei Date: Sat, 21 Nov 2020 09:13:24 +0800 Subject: [PATCH 6/9] fix(reactivity): add test case --- packages/reactivity/__tests__/effect.spec.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 6be4d8e25dd..27d26b1327b 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -6,7 +6,8 @@ import { TrackOpTypes, TriggerOpTypes, DebuggerEvent, - markRaw + markRaw, + ref } from '../src/index' import { ITERATE_KEY } from '../src/effect' @@ -811,4 +812,17 @@ describe('reactivity/effect', () => { expect(dummy).toBe(0) expect(record).toBeUndefined() }) + + it('should track hasOwnProperty when obj call it itself', () => { + const obj: any = reactive({}) + const has = ref(false) + const fnSpy = jest.fn() + effect(() => { + fnSpy() + has.value = obj.hasOwnProperty('foo') + }) + obj.foo = 1 + expect(fnSpy).toHaveBeenCalledTimes(2) + expect(has.value).toBe(true) + }) }) From 1f0b95972737a69a0e873c6228ee9f109c11e1d0 Mon Sep 17 00:00:00 2001 From: daiwei Date: Sat, 21 Nov 2020 09:20:18 +0800 Subject: [PATCH 7/9] fix(reactivity): add test case --- packages/reactivity/__tests__/effect.spec.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 27d26b1327b..0573938c344 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -825,4 +825,17 @@ describe('reactivity/effect', () => { expect(fnSpy).toHaveBeenCalledTimes(2) expect(has.value).toBe(true) }) + + it('should not track hasOwnProperty when Object.prototype.hasOwnProperty.call', () => { + const obj: any = reactive({}) + const has = ref(false) + const fnSpy = jest.fn() + effect(() => { + fnSpy() + has.value = Object.prototype.hasOwnProperty.call(obj, 'foo') + }) + obj.foo = 1 + expect(fnSpy).toHaveBeenCalledTimes(1) + expect(has.value).toBe(false) + }) }) From a08c913031cd1f1c0c147aa568a00cfccde3988f Mon Sep 17 00:00:00 2001 From: daiwei Date: Sat, 21 Nov 2020 09:23:13 +0800 Subject: [PATCH 8/9] fix(reactivity): add test case --- packages/reactivity/__tests__/effect.spec.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 0573938c344..2c23a50325c 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -817,10 +817,14 @@ describe('reactivity/effect', () => { const obj: any = reactive({}) const has = ref(false) const fnSpy = jest.fn() + effect(() => { fnSpy() has.value = obj.hasOwnProperty('foo') }) + expect(fnSpy).toHaveBeenCalledTimes(1) + expect(has.value).toBe(false) + obj.foo = 1 expect(fnSpy).toHaveBeenCalledTimes(2) expect(has.value).toBe(true) @@ -830,10 +834,14 @@ describe('reactivity/effect', () => { const obj: any = reactive({}) const has = ref(false) const fnSpy = jest.fn() + effect(() => { fnSpy() has.value = Object.prototype.hasOwnProperty.call(obj, 'foo') }) + expect(fnSpy).toHaveBeenCalledTimes(1) + expect(has.value).toBe(false) + obj.foo = 1 expect(fnSpy).toHaveBeenCalledTimes(1) expect(has.value).toBe(false) From fe7a0a8a22249b0cea85f85ab20e44887e2281d8 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 14 Nov 2022 03:58:14 -0500 Subject: [PATCH 9/9] Update effect.spec.ts --- packages/reactivity/__tests__/effect.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index a2fa995a1ab..c8182dbee36 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/packages/reactivity/__tests__/effect.spec.ts @@ -8,7 +8,6 @@ import { TriggerOpTypes, DebuggerEvent, markRaw, - ref, shallowReactive, readonly, ReactiveEffectRunner