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[] = []
|
||||
const onTrigger = vi.fn((e: DebuggerEvent) => {
|
||||
events.push(e)
|
||||
|
@ -618,4 +618,29 @@ describe('reactivity/computed', () => {
|
|||
expect(serializeInner(root)).toBe('Hello World World World World')
|
||||
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>,
|
||||
dirtyLevel: DirtyLevels = DirtyLevels.Dirty,
|
||||
newVal?: any,
|
||||
oldVal?: any,
|
||||
) {
|
||||
ref = toRaw(ref)
|
||||
const dep = ref.dep
|
||||
|
@ -82,6 +83,7 @@ export function triggerRefValue(
|
|||
type: TriggerOpTypes.SET,
|
||||
key: 'value',
|
||||
newValue: newVal,
|
||||
oldValue: oldVal,
|
||||
}
|
||||
: void 0,
|
||||
)
|
||||
|
@ -177,9 +179,10 @@ class RefImpl<T> {
|
|||
this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
|
||||
newVal = useDirectValue ? newVal : toRaw(newVal)
|
||||
if (hasChanged(newVal, this._rawValue)) {
|
||||
const oldVal = this._rawValue
|
||||
this._rawValue = newVal
|
||||
this._value = useDirectValue ? newVal : toReactive(newVal)
|
||||
triggerRefValue(this, DirtyLevels.Dirty, newVal)
|
||||
triggerRefValue(this, DirtyLevels.Dirty, newVal, oldVal)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue