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 ) } }