diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 6be4d8e25dd..34a0976030a 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, + 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) + }) }) diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index a5726b9fec3..e4f9f2a3ff7 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -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