diff --git a/src/core/instance/lifecycle.ts b/src/core/instance/lifecycle.ts index 94f42e27eb5..d1b5a76d990 100644 --- a/src/core/instance/lifecycle.ts +++ b/src/core/instance/lifecycle.ts @@ -18,6 +18,7 @@ import { invokeWithErrorHandling } from '../util/index' import { currentInstance, setCurrentInstance } from 'v3/currentInstance' +import { getCurrentScope } from 'v3/reactivity/effectScope' import { syncSetupProxy } from 'v3/apiSetup' export let activeInstance: any = null @@ -398,7 +399,8 @@ export function callHook( ) { // #7573 disable dep collection when invoking lifecycle hooks pushTarget() - const prev = currentInstance + const prevInst = currentInstance + const prevScope = getCurrentScope() setContext && setCurrentInstance(vm) const handlers = vm.$options[hook] const info = `${hook} hook` @@ -410,6 +412,10 @@ export function callHook( if (vm._hasHookEvent) { vm.$emit('hook:' + hook) } - setContext && setCurrentInstance(prev) + if (setContext) { + setCurrentInstance(prevInst) + prevScope && prevScope.on() + } + popTarget() } diff --git a/test/unit/features/v3/reactivity/effectScope.spec.ts b/test/unit/features/v3/reactivity/effectScope.spec.ts index 6b837e67cdc..78966e42e4d 100644 --- a/test/unit/features/v3/reactivity/effectScope.spec.ts +++ b/test/unit/features/v3/reactivity/effectScope.spec.ts @@ -1,3 +1,4 @@ +import Vue from 'vue' import { nextTick } from 'core/util' import { watch, @@ -290,4 +291,28 @@ describe('reactivity/effectScope', () => { expect(getCurrentScope()).toBe(parentScope) }) }) + + it('scope should not break currentScope when component call hooks', () => { + const scope = new EffectScope() + const vm = new Vue({ + template: ` +