feat(reactivity): support onTrack/onTrigger debug options for computed

This commit is contained in:
Evan You
2021-07-08 17:09:23 -04:00
parent b7ea7c1485
commit 5cea9a1d4e
4 changed files with 100 additions and 10 deletions

View File

@@ -5,7 +5,12 @@ import {
ref,
WritableComputedRef,
isReadonly,
setComputedScheduler
setComputedScheduler,
DebuggerEvent,
toRaw,
TrackOpTypes,
ITERATE_KEY,
TriggerOpTypes
} from '../src'
describe('reactivity/computed', () => {
@@ -200,6 +205,75 @@ describe('reactivity/computed', () => {
expect(x.value).toBe(1)
})
it('debug: onTrack', () => {
let events: DebuggerEvent[] = []
const onTrack = jest.fn((e: DebuggerEvent) => {
events.push(e)
})
const obj = reactive({ foo: 1, bar: 2 })
const c = computed(() => (obj.foo, 'bar' in obj, Object.keys(obj)), {
onTrack
})
expect(c.value).toEqual(['foo', 'bar'])
expect(onTrack).toHaveBeenCalledTimes(3)
expect(events).toEqual([
{
effect: c.effect,
target: toRaw(obj),
type: TrackOpTypes.GET,
key: 'foo'
},
{
effect: c.effect,
target: toRaw(obj),
type: TrackOpTypes.HAS,
key: 'bar'
},
{
effect: c.effect,
target: toRaw(obj),
type: TrackOpTypes.ITERATE,
key: ITERATE_KEY
}
])
})
it('debug: onTrigger', () => {
let events: DebuggerEvent[] = []
const onTrigger = jest.fn((e: DebuggerEvent) => {
events.push(e)
})
const obj = reactive({ foo: 1 })
const c = computed(() => obj.foo, { onTrigger })
// computed won't trigger compute until accessed
c.value
obj.foo++
expect(c.value).toBe(2)
expect(onTrigger).toHaveBeenCalledTimes(1)
expect(events[0]).toEqual({
effect: c.effect,
target: toRaw(obj),
type: TriggerOpTypes.SET,
key: 'foo',
oldValue: 1,
newValue: 2
})
// @ts-ignore
delete obj.foo
expect(c.value).toBeUndefined()
expect(onTrigger).toHaveBeenCalledTimes(2)
expect(events[1]).toEqual({
effect: c.effect,
target: toRaw(obj),
type: TriggerOpTypes.DELETE,
key: 'foo',
oldValue: 2
})
})
describe('with scheduler', () => {
// a simple scheduler similar to the main Vue scheduler
const tick = Promise.resolve()