fix(runtime-core): Lifecycle hooks should support callbacks shared by reference (#6687)

fix #6686
This commit is contained in:
Thorsten Lünborg 2022-09-27 04:18:22 +02:00 committed by GitHub
parent 96ba71d0cf
commit c71a08e6fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 1 deletions

View File

@ -378,4 +378,27 @@ describe('api: lifecycle hooks', () => {
newValue: 3
})
})
it('runs shared hook fn for each instance', async () => {
const fn = jest.fn()
const toggle = ref(true)
const Comp = {
setup() {
return () => (toggle.value ? [h(Child), h(Child)] : null)
}
}
const Child = {
setup() {
onMounted(fn)
onBeforeUnmount(fn)
return () => h('div')
}
}
render(h(Comp), nodeOps.createElement('div'))
expect(fn).toHaveBeenCalledTimes(2)
toggle.value = false
await nextTick()
expect(fn).toHaveBeenCalledTimes(4)
})
})

View File

@ -68,7 +68,7 @@ export const createHook =
(hook: T, target: ComponentInternalInstance | null = currentInstance) =>
// post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
(!isInSSRComponentSetup || lifecycle === LifecycleHooks.SERVER_PREFETCH) &&
injectHook(lifecycle, hook, target)
injectHook(lifecycle, (...args: unknown[]) => hook(...args), target)
export const onBeforeMount = createHook(LifecycleHooks.BEFORE_MOUNT)
export const onMounted = createHook(LifecycleHooks.MOUNTED)