)
})
+ test('should work when using template ref as target', async () => {
+ const root = nodeOps.createElement('div')
+ const target = ref(null)
+ const disabled = ref(true)
+
+ const App = {
+ setup() {
+ return () =>
+ h(Fragment, [
+ h('div', { ref: target }),
+ h(
+ Teleport,
+ { to: target.value, disabled: disabled.value },
+ h('div', 'teleported')
+ )
+ ])
+ }
+ }
+ render(h(App), root)
+ expect(serializeInner(root)).toMatchInlineSnapshot(
+ `"<div></div><!--teleport start--><div>teleported</div><!--teleport end-->"`
+ )
+
+ disabled.value = false
+ await nextTick()
+ expect(serializeInner(root)).toMatchInlineSnapshot(
+ `"<div><div>teleported</div></div><!--teleport start--><!--teleport end-->"`
+ )
+ })
+
test('disabled', () => {
const target = nodeOps.createElement('div')
const root = nodeOps.createElement('div')
export type TeleportVNode = VNode<RendererNode, RendererElement, TeleportProps>
export interface TeleportProps {
- to: string | RendererElement
+ to: string | RendererElement | null | undefined
disabled?: boolean
}
return target as any
}
} else {
- if (__DEV__ && !targetSelector) {
+ if (__DEV__ && !targetSelector && !isTeleportDisabled(props)) {
warn(`Invalid Teleport target: ${targetSelector}`)
}
return targetSelector as any
const targetAnchor = (n2.targetAnchor = createText(''))
if (target) {
insert(targetAnchor, target)
- } else if (__DEV__) {
+ } else if (__DEV__ && !disabled) {
warn('Invalid Teleport target on mount:', target, `(${typeof target})`)
}