testUnmount({ to: null, disabled: true })
})
+ test('component with multi roots should be removed when unmounted', () => {
+ const target = nodeOps.createElement('div')
+ const root = nodeOps.createElement('div')
+
+ const Comp = {
+ render() {
+ return [h('p'), h('p')]
+ }
+ }
+
+ render(
+ h(() => [h(Teleport, { to: target }, h(Comp)), h('div', 'root')]),
+ root
+ )
+ expect(serializeInner(target)).toMatchInlineSnapshot(`"<p></p><p></p>"`)
+
+ render(null, root)
+ expect(serializeInner(target)).toBe('')
+ })
+
test('multiple teleport with same target', () => {
const target = nodeOps.createElement('div')
const root = nodeOps.createElement('div')
export const isTeleport = (type: any): boolean => type.__isTeleport
-export const isTeleportDisabled = (props: VNode['props']): boolean =>
+const isTeleportDisabled = (props: VNode['props']): boolean =>
props && (props.disabled || props.disabled === '')
const isTargetSVG = (target: RendererElement): boolean =>
remove(
vnode: VNode,
- { r: remove, o: { remove: hostRemove } }: RendererInternals,
+ parentComponent: ComponentInternalInstance | null,
+ parentSuspense: SuspenseBoundary | null,
+ optimized: boolean,
+ { um: unmount, o: { remove: hostRemove } }: RendererInternals,
doRemove: Boolean
) {
const { shapeFlag, children, anchor, targetAnchor, target, props } = vnode
hostRemove(anchor!)
if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
for (let i = 0; i < (children as VNode[]).length; i++) {
- remove((children as VNode[])[i])
+ unmount(
+ (children as VNode[])[i],
+ parentComponent,
+ parentSuspense,
+ true,
+ optimized
+ )
}
}
}
}
if (shapeFlag & ShapeFlags.TELEPORT) {
- ;(vnode.type as typeof TeleportImpl).remove(vnode, internals, doRemove)
+ ;(vnode.type as typeof TeleportImpl).remove(
+ vnode,
+ parentComponent,
+ parentSuspense,
+ optimized,
+ internals,
+ doRemove
+ )
}
if (doRemove) {