Skip to content

Commit

Permalink
fix(lifecycle): scope might changed when call hook (#13070)
Browse files Browse the repository at this point in the history
  • Loading branch information
gcaaa31928 authored Oct 22, 2023
1 parent 1399ee6 commit 74ca5a1
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
10 changes: 8 additions & 2 deletions src/core/instance/lifecycle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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`
Expand All @@ -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()
}
25 changes: 25 additions & 0 deletions test/unit/features/v3/reactivity/effectScope.spec.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Vue from 'vue'
import { nextTick } from 'core/util'
import {
watch,
Expand Down Expand Up @@ -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: `
<div>
<div v-if="show" />
</div>
`,
data() {
return {
show: false
}
}
}).$mount()

scope.run(() => {
// call renderTriggered hook here
vm.show = true
// this effect should be collected by scope not the component scope
effect(() => {})
})
expect(scope.effects.length).toBe(1)
})
})

0 comments on commit 74ca5a1

Please sign in to comment.