fix(ref): should not trigger when setting value to same proxy (#3658)

This commit is contained in:
Yang Mingshan 2021-07-16 04:28:01 +08:00 committed by GitHub
parent f6a5f09a3a
commit 08f504c1b7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 3 deletions

View File

@ -336,4 +336,24 @@ describe('reactivity/ref', () => {
_trigger!() _trigger!()
expect(dummy).toBe(2) 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)
})
}) })

View File

@ -52,12 +52,15 @@ export function shallowRef(value?: unknown) {
} }
class RefImpl<T> { class RefImpl<T> {
private _rawValue: T
private _value: T private _value: T
public readonly __v_isRef = true public readonly __v_isRef = true
constructor(private _rawValue: T, public readonly _shallow: boolean) { constructor(value: T, public readonly _shallow = false) {
this._value = _shallow ? _rawValue : convert(_rawValue) this._rawValue = _shallow ? value : toRaw(value)
this._value = _shallow ? value : convert(value)
} }
get value() { get value() {
@ -66,7 +69,8 @@ class RefImpl<T> {
} }
set value(newVal) { set value(newVal) {
if (hasChanged(toRaw(newVal), this._rawValue)) { newVal = this._shallow ? newVal : toRaw(newVal)
if (hasChanged(newVal, this._rawValue)) {
this._rawValue = newVal this._rawValue = newVal
this._value = this._shallow ? newVal : convert(newVal) this._value = this._shallow ? newVal : convert(newVal)
trigger(toRaw(this), TriggerOpTypes.SET, 'value', newVal) trigger(toRaw(this), TriggerOpTypes.SET, 'value', newVal)