diff --git a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts
index 82f6f02f..8c28d881 100644
--- a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts
+++ b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts
@@ -1,6 +1,7 @@
import {
h,
Fragment,
+ Teleport,
createVNode,
createCommentVNode,
openBlock,
@@ -578,6 +579,47 @@ describe('renderer: optimized mode', () => {
expect(inner(root)).toBe('
World
')
})
+ //#3623
+ test('nested teleport unmount need exit the optimization mode', () => {
+ const target = nodeOps.createElement('div')
+ const root = nodeOps.createElement('div')
+
+ render(
+ (openBlock(),
+ createBlock('div', null, [
+ (openBlock(),
+ createBlock(
+ Teleport as any,
+ {
+ to: target
+ },
+ [
+ createVNode('div', null, [
+ (openBlock(),
+ createBlock(
+ Teleport as any,
+ {
+ to: target
+ },
+ [createVNode('div', null, 'foo')]
+ ))
+ ])
+ ]
+ ))
+ ])),
+ root
+ )
+ expect(inner(target)).toMatchInlineSnapshot(
+ `"foo
"`
+ )
+ expect(inner(root)).toMatchInlineSnapshot(
+ `""`
+ )
+
+ render(null, root)
+ expect(inner(target)).toBe('')
+ })
+
// #3548
test('should not track dynamic children when the user calls a compiled slot inside template expression', () => {
const Comp = {
diff --git a/packages/runtime-core/src/components/Teleport.ts b/packages/runtime-core/src/components/Teleport.ts
index 764e9a86..78aee948 100644
--- a/packages/runtime-core/src/components/Teleport.ts
+++ b/packages/runtime-core/src/components/Teleport.ts
@@ -243,12 +243,13 @@ export const TeleportImpl = {
hostRemove(anchor!)
if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
for (let i = 0; i < (children as VNode[]).length; i++) {
+ const child = (children as VNode[])[i]
unmount(
- (children as VNode[])[i],
+ child,
parentComponent,
parentSuspense,
true,
- optimized
+ !!child.dynamicChildren
)
}
}