ソースを参照

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

fix #6686
Thorsten Lünborg 3 年 前
コミット
c71a08e6fd

+ 23 - 0
packages/runtime-core/__tests__/apiLifecycle.spec.ts

@@ -378,4 +378,27 @@ describe('api: lifecycle hooks', () => {
       newValue: 3
       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)
+  })
 })
 })

+ 1 - 1
packages/runtime-core/src/apiLifecycle.ts

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