diff --git a/packages/runtime-core/__tests__/apiLifecycle.spec.ts b/packages/runtime-core/__tests__/apiLifecycle.spec.ts index 4c27ada55c4..b7e8de30d55 100644 --- a/packages/runtime-core/__tests__/apiLifecycle.spec.ts +++ b/packages/runtime-core/__tests__/apiLifecycle.spec.ts @@ -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) + }) }) diff --git a/packages/runtime-core/src/apiLifecycle.ts b/packages/runtime-core/src/apiLifecycle.ts index ec39308eea5..f7d6d7007c1 100644 --- a/packages/runtime-core/src/apiLifecycle.ts +++ b/packages/runtime-core/src/apiLifecycle.ts @@ -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)