Переглянути джерело

fix(runtime-core): ensure custom events are not emitted anymore after unmount. (#5679)

close #5674
Thorsten Lünborg 4 роки тому
батько
коміт
71c9536625

+ 27 - 1
packages/runtime-core/__tests__/componentEmits.spec.ts

@@ -6,7 +6,8 @@ import {
   defineComponent,
   h,
   nodeOps,
-  toHandlers
+  toHandlers,
+  nextTick
 } from '@vue/runtime-test'
 import { isEmitListener } from '../src/componentEmits'
 
@@ -374,4 +375,29 @@ describe('component: emit', () => {
     // PascalCase option
     expect(isEmitListener(options, 'onFooBaz')).toBe(true)
   })
+
+  test('does not emit after unmount', async () => {
+    const fn = jest.fn()
+    const Foo = defineComponent({
+      emits: ['closing'],
+      async beforeUnmount() {
+        await this.$nextTick()
+        this.$emit('closing', true)
+      },
+      render() {
+        return h('div')
+      }
+    })
+    const Comp = () =>
+      h(Foo, {
+        onClosing: fn
+      })
+
+    const el = nodeOps.createElement('div')
+    render(h(Comp), el)
+    await nextTick()
+    render(null, el)
+    await nextTick()
+    expect(fn).not.toHaveBeenCalled()
+  })
 })

+ 1 - 0
packages/runtime-core/src/componentEmits.ts

@@ -73,6 +73,7 @@ export function emit(
   event: string,
   ...rawArgs: any[]
 ) {
+  if (instance.isUnmounted) return
   const props = instance.vnode.props || EMPTY_OBJ
 
   if (__DEV__) {