mirror of https://github.com/vuejs/core.git
fix(reactivity): pass oldValue in debug info when triggering refs (#8210)
fix vuejs/pinia#2061
This commit is contained in:
parent
be1e9bf03f
commit
3b0a56a9c4
|
|
@ -258,7 +258,7 @@ describe('reactivity/computed', () => {
|
||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
it('debug: onTrigger', () => {
|
it('debug: onTrigger (reactive)', () => {
|
||||||
let events: DebuggerEvent[] = []
|
let events: DebuggerEvent[] = []
|
||||||
const onTrigger = vi.fn((e: DebuggerEvent) => {
|
const onTrigger = vi.fn((e: DebuggerEvent) => {
|
||||||
events.push(e)
|
events.push(e)
|
||||||
|
|
@ -618,4 +618,29 @@ describe('reactivity/computed', () => {
|
||||||
expect(serializeInner(root)).toBe('Hello World World World World')
|
expect(serializeInner(root)).toBe('Hello World World World World')
|
||||||
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
|
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('debug: onTrigger (ref)', () => {
|
||||||
|
let events: DebuggerEvent[] = []
|
||||||
|
const onTrigger = vi.fn((e: DebuggerEvent) => {
|
||||||
|
events.push(e)
|
||||||
|
})
|
||||||
|
const obj = ref(1)
|
||||||
|
const c = computed(() => obj.value, { onTrigger })
|
||||||
|
|
||||||
|
// computed won't trigger compute until accessed
|
||||||
|
c.value
|
||||||
|
|
||||||
|
obj.value++
|
||||||
|
|
||||||
|
expect(c.value).toBe(2)
|
||||||
|
expect(onTrigger).toHaveBeenCalledTimes(1)
|
||||||
|
expect(events[0]).toEqual({
|
||||||
|
effect: c.effect,
|
||||||
|
target: toRaw(obj),
|
||||||
|
type: TriggerOpTypes.SET,
|
||||||
|
key: 'value',
|
||||||
|
oldValue: 1,
|
||||||
|
newValue: 2,
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,7 @@ export function triggerRefValue(
|
||||||
ref: RefBase<any>,
|
ref: RefBase<any>,
|
||||||
dirtyLevel: DirtyLevels = DirtyLevels.Dirty,
|
dirtyLevel: DirtyLevels = DirtyLevels.Dirty,
|
||||||
newVal?: any,
|
newVal?: any,
|
||||||
|
oldVal?: any,
|
||||||
) {
|
) {
|
||||||
ref = toRaw(ref)
|
ref = toRaw(ref)
|
||||||
const dep = ref.dep
|
const dep = ref.dep
|
||||||
|
|
@ -82,6 +83,7 @@ export function triggerRefValue(
|
||||||
type: TriggerOpTypes.SET,
|
type: TriggerOpTypes.SET,
|
||||||
key: 'value',
|
key: 'value',
|
||||||
newValue: newVal,
|
newValue: newVal,
|
||||||
|
oldValue: oldVal,
|
||||||
}
|
}
|
||||||
: void 0,
|
: void 0,
|
||||||
)
|
)
|
||||||
|
|
@ -177,9 +179,10 @@ class RefImpl<T> {
|
||||||
this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
|
this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
|
||||||
newVal = useDirectValue ? newVal : toRaw(newVal)
|
newVal = useDirectValue ? newVal : toRaw(newVal)
|
||||||
if (hasChanged(newVal, this._rawValue)) {
|
if (hasChanged(newVal, this._rawValue)) {
|
||||||
|
const oldVal = this._rawValue
|
||||||
this._rawValue = newVal
|
this._rawValue = newVal
|
||||||
this._value = useDirectValue ? newVal : toReactive(newVal)
|
this._value = useDirectValue ? newVal : toReactive(newVal)
|
||||||
triggerRefValue(this, DirtyLevels.Dirty, newVal)
|
triggerRefValue(this, DirtyLevels.Dirty, newVal, oldVal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue