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 => {