From 08f504c1b7798d95c1c0a9d0894b846ff955ce3c Mon Sep 17 00:00:00 2001 From: Yang Mingshan Date: Fri, 16 Jul 2021 04:28:01 +0800 Subject: [PATCH] fix(ref): should not trigger when setting value to same proxy (#3658) --- packages/reactivity/__tests__/ref.spec.ts | 20 ++++++++++++++++++++ packages/reactivity/src/ref.ts | 10 +++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/__tests__/ref.spec.ts b/packages/reactivity/__tests__/ref.spec.ts index 883af0f874b..94ad47ec63d 100644 --- a/packages/reactivity/__tests__/ref.spec.ts +++ b/packages/reactivity/__tests__/ref.spec.ts @@ -336,4 +336,24 @@ describe('reactivity/ref', () => { _trigger!() expect(dummy).toBe(2) }) + + test('should not trigger when setting value to same proxy', () => { + const obj = reactive({ count: 0 }) + + const a = ref(obj) + const spy1 = jest.fn(() => a.value) + + effect(spy1) + + a.value = obj + expect(spy1).toBeCalledTimes(1) + + const b = shallowRef(obj) + const spy2 = jest.fn(() => b.value) + + effect(spy2) + + b.value = obj + expect(spy2).toBeCalledTimes(1) + }) }) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 3d1f1453ca1..1f6c93cacfa 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -52,12 +52,15 @@ export function shallowRef(value?: unknown) { } class RefImpl { + private _rawValue: T + private _value: T public readonly __v_isRef = true - constructor(private _rawValue: T, public readonly _shallow: boolean) { - this._value = _shallow ? _rawValue : convert(_rawValue) + constructor(value: T, public readonly _shallow = false) { + this._rawValue = _shallow ? value : toRaw(value) + this._value = _shallow ? value : convert(value) } get value() { @@ -66,7 +69,8 @@ class RefImpl { } set value(newVal) { - if (hasChanged(toRaw(newVal), this._rawValue)) { + newVal = this._shallow ? newVal : toRaw(newVal) + if (hasChanged(newVal, this._rawValue)) { this._rawValue = newVal this._value = this._shallow ? newVal : convert(newVal) trigger(toRaw(this), TriggerOpTypes.SET, 'value', newVal)