fix(reactivity): pass oldValue in debug info when triggering refs (#8210)

fix vuejs/pinia#2061
This commit is contained in:
Fan Pei 2024-06-05 00:25:37 +09:00 committed by GitHub
parent be1e9bf03f
commit 3b0a56a9c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 30 additions and 2 deletions

View File

@ -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,
})
})
})

View File

@ -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)
}
}
}