show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot-->')
})
test('vdom slot > vapor forwarded slot(with fallback) > vapor slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>forwarded fallback</div>')
+ expect(root.innerHTML).toBe('<div>forwarded fallback</div><!--slot-->')
})
test('vdom slot > vapor forwarded slot > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot--><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot--><!--slot-->')
})
test('vdom slot > vapor forwarded slot (multiple) > vdom forwarded slot(with fallback) > vdom slot', async () => {
show.value = false
await nextTick()
expect(root.innerHTML).toBe(
- '<!--slot--><!--slot--><div>vdom fallback</div>',
+ '<div>vdom fallback</div><!--slot--><!--slot-->',
)
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot--><!--slot-->')
})
test('vdom slot > vdom forwarded slot > vapor slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vdom forwarded slot (multiple) > vapor forwarded slot > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vdom forwarded slot (multiple) > vapor forwarded slot(with fallback) > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>vapor fallback</div>')
+ expect(root.innerHTML).toBe('<div>vapor fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vapor forwarded slot > vapor forwarded slot > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vapor forwarded slot(with fallback) > vapor forwarded slot > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>vapor1 fallback</div>')
+ expect(root.innerHTML).toBe('<div>vapor1 fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vapor forwarded slot > vapor forwarded slot(with fallback) > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>vapor2 fallback</div>')
+ expect(root.innerHTML).toBe('<div>vapor2 fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vapor forwarded slot > vapor forwarded slot > vapor slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><div>fallback</div>')
+ expect(root.innerHTML).toBe('<div>fallback</div><!--slot--><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot--><!--slot-->')
})
test('vdom slot > vapor forwarded slot(with fallback) > vapor forwarded slot(with fallback) > vdom slot', async () => {
show.value = false
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><div>vapor1 fallback</div>')
+ expect(root.innerHTML).toBe('<div>vapor1 fallback</div><!--slot-->')
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot-->')
})
test('vdom slot > vapor forwarded slot(with fallback) > vapor forwarded slot(with fallback) > vapor slot', async () => {
show.value = false
await nextTick()
expect(root.innerHTML).toBe(
- '<!--slot--><!--slot--><div>vapor1 fallback</div>',
+ '<div>vapor1 fallback</div><!--slot--><!--slot-->',
)
show.value = true
await nextTick()
- expect(root.innerHTML).toBe('<!--slot--><!--slot--><span>bar</span>')
+ expect(root.innerHTML).toBe('<span>bar</span><!--slot--><!--slot-->')
})
test('vdom slot > vdom forwarded slot(with fallback) > vdom forwarded slot(with fallback) > vapor slot', async () => {
slot(n1: VNode, n2: VNode, container, anchor) {
if (!n1) {
// mount
- const selfAnchor = (n2.el = n2.anchor = createTextNode())
- insert(selfAnchor, container, anchor)
+ let selfAnchor: Node | undefined
const { slot, fallback } = n2.vs!
const propsRef = (n2.vs!.ref = shallowRef(n2.props))
const slotBlock = slot(new Proxy(propsRef, vaporSlotPropsProxyHandler))
- // TODO fallback for slot with v-if content
- // fallback is a vnode slot function here, and slotBlock, if a DynamicFragment,
- // expects a Vapor BlockFn as fallback
- // fallback
-
// forwarded vdom slot without its own fallback, use the fallback provided by
// the slot outlet
if (slotBlock instanceof DynamicFragment) {
ensureVDOMSlotFallback(nodes, fallback)
nodes = nodes.nodes
}
+ // use fragment's anchor when possible
+ selfAnchor = slotBlock.anchor
} else if (isFragment(slotBlock)) {
ensureVDOMSlotFallback(slotBlock, fallback)
+ selfAnchor = slotBlock.anchor!
}
- // TODO use fragment's anchor as selfAnchor?
+ if (!selfAnchor) selfAnchor = createTextNode()
+ insert((n2.el = n2.anchor = selfAnchor), container, anchor)
insert((n2.vb = slotBlock), container, selfAnchor)
} else {
// update