await nextTick()
expect(html()).toBe('<div><div>B</div><!--dynamic-component--></div>')
})
+
+ test('fallback with dynamic slots', async () => {
+ const slotName = ref('default')
+ const { html } = define({
+ setup() {
+ return createDynamicComponent(() => 'div', null, {
+ $: [
+ () => ({
+ name: slotName.value,
+ fn: () => template('<span>hi</span>')(),
+ }),
+ ] as any,
+ })
+ },
+ }).render()
+
+ expect(html()).toBe(
+ '<div><span>hi</span><!--slot--></div><!--dynamic-component-->',
+ )
+
+ // update slot name
+ slotName.value = 'custom'
+ await nextTick()
+ expect(html()).toBe('<div><!--slot--></div><!--dynamic-component-->')
+
+ slotName.value = 'default'
+ await nextTick()
+ expect(html()).toBe(
+ '<div><span>hi</span><!--slot--></div><!--dynamic-component-->',
+ )
+ })
})
setCurrentHydrationNode(el.firstChild)
}
if (rawSlots.$) {
- // TODO dynamic slot fragment
+ const frag =
+ isHydrating || __DEV__
+ ? new DynamicFragment('slot')
+ : new DynamicFragment()
+
+ renderEffect(() => frag.update(getSlot(rawSlots as RawSlots, 'default')))
+
+ if (!isHydrating) {
+ const scopeId = currentInstance!.type.__scopeId
+ if (scopeId) setScopeId(frag, [`${scopeId}-s`])
+ insert(frag, el)
+ } else {
+ frag.hydrate()
+ }
} else {
insert(getSlot(rawSlots as RawSlots, 'default')!(), el)
}