fix(ref): should not trigger when setting value to same proxy (#3658)
This commit is contained in:
parent
f6a5f09a3a
commit
08f504c1b7
@ -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)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user