Skip to content

Commit

Permalink
fix(reactivity): pass oldValue in debug info when triggering refs (#8210
Browse files Browse the repository at this point in the history
  • Loading branch information
Azurewarth0920 committed Jun 4, 2024
1 parent be1e9bf commit 3b0a56a
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 2 deletions.
27 changes: 26 additions & 1 deletion packages/reactivity/__tests__/computed.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
})
})
})
5 changes: 4 additions & 1 deletion packages/reactivity/src/ref.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -82,6 +83,7 @@ export function triggerRefValue(
type: TriggerOpTypes.SET,
key: 'value',
newValue: newVal,
oldValue: oldVal,
}
: void 0,
)
Expand Down Expand Up @@ -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)
}
}
}
Expand Down

0 comments on commit 3b0a56a

Please sign in to comment.