diff --git a/packages/runtime-core/__tests__/components/Teleport.spec.ts b/packages/runtime-core/__tests__/components/Teleport.spec.ts index c0dbd4cae9c..68a85991296 100644 --- a/packages/runtime-core/__tests__/components/Teleport.spec.ts +++ b/packages/runtime-core/__tests__/components/Teleport.spec.ts @@ -553,4 +553,44 @@ describe('renderer: teleport', () => { `"
teleported
"` ) }) + + // #9071 + test('should render within the target element unique child element', async () => { + const root = document.createElement('div') + + const show = ref(false) + + const App = defineComponent({ + setup() { + return () => { + return show.value + ? h(Teleport, { to: root }, h('div', 'Teleported')) + : h('div', 'foo') + } + } + }) + + domRender(h(App), root) + + expect(root.innerHTML).toMatchInlineSnapshot('"
foo
"') + + show.value = true + await nextTick() + + expect(root.innerHTML).toMatchInlineSnapshot( + '"
Teleported
"' + ) + + show.value = false + await nextTick() + + expect(root.innerHTML).toMatchInlineSnapshot('"
foo
"') + + show.value = true + await nextTick() + + expect(root.innerHTML).toMatchInlineSnapshot( + '"
Teleported
"' + ) + }) }) diff --git a/packages/runtime-dom/src/nodeOps.ts b/packages/runtime-dom/src/nodeOps.ts index daf56fc6f3a..a0fa47158fd 100644 --- a/packages/runtime-dom/src/nodeOps.ts +++ b/packages/runtime-dom/src/nodeOps.ts @@ -8,7 +8,9 @@ const templateContainer = doc && /*#__PURE__*/ doc.createElement('template') export const nodeOps: Omit, 'patchProp'> = { insert: (child, parent, anchor) => { - parent.insertBefore(child, anchor || null) + // #9071 + anchor = anchor && anchor.parentNode === parent ? anchor : null + parent.insertBefore(child, anchor) }, remove: child => {