From 7c1e665215adf22bf2d8fff776a0a58e7dfee0f9 Mon Sep 17 00:00:00 2001 From: Evan You Date: Tue, 4 May 2021 11:34:15 -0400 Subject: [PATCH] wip: root instance $destroy before $mount --- packages/runtime-core/src/compat/global.ts | 28 +++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 4cf57743a..0949d5971 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -1,6 +1,7 @@ import { isReactive, reactive, + stop, track, TrackOpTypes, trigger, @@ -13,7 +14,8 @@ import { EMPTY_OBJ, isArray, isObject, - isString + isString, + invokeArrayFns } from '@vue/shared' import { warn } from '../warning' import { cloneVNode, createVNode } from '../vnode' @@ -467,8 +469,28 @@ export function installCompatMount( devtoolsUnmountApp(app) } delete app._container.__vue_app__ - } else if (__DEV__) { - warn(`Cannot unmount an app that is not mounted.`) + } else { + const { bum, effects, um } = instance + // beforeDestroy hooks + if (bum) { + invokeArrayFns(bum) + } + if (isCompatEnabled(DeprecationTypes.INSTANCE_EVENT_HOOKS, instance)) { + instance.emit('hook:beforeDestroy') + } + // stop effects + if (effects) { + for (let i = 0; i < effects.length; i++) { + stop(effects[i]) + } + } + // unmounted hook + if (um) { + invokeArrayFns(um) + } + if (isCompatEnabled(DeprecationTypes.INSTANCE_EVENT_HOOKS, instance)) { + instance.emit('hook:destroyed') + } } }