mirror of https://github.com/vuejs/core.git
fix(reactivity): onCleanup also needs to be cleaned (#8655)
close #5151 close #7695
This commit is contained in:
parent
3227e50b32
commit
73fd810eeb
|
@ -1205,4 +1205,39 @@ describe('api: watch', () => {
|
||||||
expect(countWE).toBe(3)
|
expect(countWE).toBe(3)
|
||||||
expect(countW).toBe(2)
|
expect(countW).toBe(2)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #5151
|
||||||
|
test('OnCleanup also needs to be cleaned,', async () => {
|
||||||
|
const spy1 = vi.fn()
|
||||||
|
const spy2 = vi.fn()
|
||||||
|
const num = ref(0)
|
||||||
|
|
||||||
|
watch(num, (value, oldValue, onCleanup) => {
|
||||||
|
if (value > 1) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
spy1()
|
||||||
|
onCleanup(() => {
|
||||||
|
// OnCleanup also needs to be cleaned
|
||||||
|
spy2()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
num.value++
|
||||||
|
await nextTick()
|
||||||
|
expect(spy1).toHaveBeenCalledTimes(1)
|
||||||
|
expect(spy2).toHaveBeenCalledTimes(0)
|
||||||
|
|
||||||
|
num.value++
|
||||||
|
await nextTick()
|
||||||
|
|
||||||
|
expect(spy1).toHaveBeenCalledTimes(1)
|
||||||
|
expect(spy2).toHaveBeenCalledTimes(1)
|
||||||
|
|
||||||
|
num.value++
|
||||||
|
await nextTick()
|
||||||
|
// would not be calld when value>1
|
||||||
|
expect(spy1).toHaveBeenCalledTimes(1)
|
||||||
|
expect(spy2).toHaveBeenCalledTimes(1)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -273,10 +273,11 @@ function doWatch(
|
||||||
getter = () => traverse(baseGetter())
|
getter = () => traverse(baseGetter())
|
||||||
}
|
}
|
||||||
|
|
||||||
let cleanup: () => void
|
let cleanup: (() => void) | undefined
|
||||||
let onCleanup: OnCleanup = (fn: () => void) => {
|
let onCleanup: OnCleanup = (fn: () => void) => {
|
||||||
cleanup = effect.onStop = () => {
|
cleanup = effect.onStop = () => {
|
||||||
callWithErrorHandling(fn, instance, ErrorCodes.WATCH_CLEANUP)
|
callWithErrorHandling(fn, instance, ErrorCodes.WATCH_CLEANUP)
|
||||||
|
cleanup = effect.onStop = undefined
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue