wip: do not fire lifecycle hooks when already unmounted

This commit is contained in:
Evan You 2019-09-11 09:07:29 -04:00
parent 6bc368b2b6
commit 51914c76e8
3 changed files with 9 additions and 0 deletions

View File

@ -17,6 +17,9 @@ function injectHook(
) {
if (target) {
;(target[type] || (target[type] = [])).push((...args: any[]) => {
if (target.isUnmounted) {
return
}
// disable tracking inside all lifecycle hooks
// since they can potentially be called inside effects.
pauseTracking()

View File

@ -98,6 +98,7 @@ export interface ComponentInternalInstance {
user: { [key: string]: any }
// lifecycle
isUnmounted: boolean
[LifecycleHooks.BEFORE_CREATE]: LifecycleHook
[LifecycleHooks.CREATED]: LifecycleHook
[LifecycleHooks.BEFORE_MOUNT]: LifecycleHook
@ -160,6 +161,7 @@ export function createComponentInstance(
// lifecycle hooks
// not using enums here because it results in computed properties
isUnmounted: false,
bc: null,
c: null,
bm: null,

View File

@ -1526,6 +1526,10 @@ export function createRenderer<
// unmounted hook
if (um !== null) {
queuePostEffect(um, parentSuspense)
// set unmounted after unmounted hooks are fired
queuePostEffect(() => {
instance.isUnmounted = true
}, parentSuspense)
}
}