From: Evan You Date: Tue, 4 May 2021 15:34:15 +0000 (-0400) Subject: wip: root instance $destroy before $mount X-Git-Tag: v3.1.0-beta.1~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c1e665215adf22bf2d8fff776a0a58e7dfee0f9;p=thirdparty%2Fvuejs%2Fcore.git wip: root instance $destroy before $mount --- diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 4cf57743a7..0949d5971d 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') + } } }