]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): should not trigger when setting value to same proxy (#2904)
authorliaoliao666 <1076988944@qq.com>
Mon, 29 Mar 2021 21:52:57 +0000 (05:52 +0800)
committerGitHub <noreply@github.com>
Mon, 29 Mar 2021 21:52:57 +0000 (17:52 -0400)
packages/reactivity/__tests__/effect.spec.ts
packages/reactivity/src/baseHandlers.ts

index 6be4d8e25dd69dea16afe2534396478382e72473..34a0976030ac32032ae74ca2f377758de99f9f51 100644 (file)
@@ -6,7 +6,8 @@ import {
   TrackOpTypes,
   TriggerOpTypes,
   DebuggerEvent,
-  markRaw
+  markRaw,
+  shallowReactive
 } from '../src/index'
 import { ITERATE_KEY } from '../src/effect'
 
@@ -811,4 +812,24 @@ describe('reactivity/effect', () => {
     expect(dummy).toBe(0)
     expect(record).toBeUndefined()
   })
+
+  it('should trigger once effect when set the equal proxy', () => {
+    const obj = reactive({ foo: 1 })
+    const observed: any = reactive({ obj })
+    const fnSpy = jest.fn(() => observed.obj)
+
+    effect(fnSpy)
+
+    observed.obj = obj
+    expect(fnSpy).toHaveBeenCalledTimes(1)
+
+    const obj2 = reactive({ foo: 1 })
+    const observed2: any = shallowReactive({ obj2 })
+    const fnSpy2 = jest.fn(() => observed2.obj2)
+
+    effect(fnSpy2)
+
+    observed2.obj2 = obj2
+    expect(fnSpy2).toHaveBeenCalledTimes(1)
+  })
 })
index a5726b9fec3e6fc65a0f9bb4219a0bf5b3f48bee..e4f9f2a3ff750067501f093214eeeffc08291dde 100644 (file)
@@ -146,9 +146,10 @@ function createSetter(shallow = false) {
     value: unknown,
     receiver: object
   ): boolean {
-    const oldValue = (target as any)[key]
+    let oldValue = (target as any)[key]
     if (!shallow) {
       value = toRaw(value)
+      oldValue = toRaw(oldValue)
       if (!isArray(target) && isRef(oldValue) && !isRef(value)) {
         oldValue.value = value
         return true