diff --git a/packages/runtime-core/src/components/Teleport.ts b/packages/runtime-core/src/components/Teleport.ts index dae83eea6..1b4306164 100644 --- a/packages/runtime-core/src/components/Teleport.ts +++ b/packages/runtime-core/src/components/Teleport.ts @@ -20,7 +20,7 @@ export interface TeleportProps { export const isTeleport = (type: any): boolean => type.__isTeleport -const isTeleportDisabled = (props: VNode['props']): boolean => +export const isTeleportDisabled = (props: VNode['props']): boolean => props && (props.disabled || props.disabled === '') const resolveTarget = ( diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 3baea539a..4cd7ccc27 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -56,7 +56,11 @@ import { queueEffectWithSuspense, SuspenseImpl } from './components/Suspense' -import { TeleportImpl, TeleportVNode } from './components/Teleport' +import { + isTeleportDisabled, + TeleportImpl, + TeleportVNode +} from './components/Teleport' import { isKeepAlive, KeepAliveContext } from './components/KeepAlive' import { registerHMR, unregisterHMR, isHmrUpdating } from './hmr' import { @@ -2037,8 +2041,11 @@ function baseCreateRenderer( unmountChildren(children as VNode[], parentComponent, parentSuspense) } - // an unmounted teleport should always remove its children - if (shapeFlag & ShapeFlags.TELEPORT) { + // an unmounted teleport should always remove its children if not disabled + if ( + shapeFlag & ShapeFlags.TELEPORT && + (doRemove || !isTeleportDisabled(vnode.props)) + ) { ;(vnode.type as typeof TeleportImpl).remove(vnode, internals) }