diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index c9f47720edd..10c09109fdb 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -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, + }) + }) }) diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index 99170d154ba..e47b8aa5582 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -69,6 +69,7 @@ export function triggerRefValue( ref: RefBase, 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 { 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) } } }