} from '../src'
import { currentInstance, nextTick, ref } from '@vue/runtime-dom'
import { makeRender } from './_utils'
+import type { DynamicSlot } from '../src/componentSlots'
const define = makeRender<any>()
await nextTick()
expect(html()).toBe('content<!--if--><!--slot-->')
})
+
+ test('dynamic slot work with v-if', async () => {
+ const val = ref('header')
+ const toggle = ref(false)
+
+ const Comp = defineVaporComponent(() => {
+ const n0 = template('<div></div>')()
+ prepend(n0 as any as ParentNode, createSlot('header', null))
+ return n0
+ })
+
+ const { host } = define(() => {
+ // dynamic slot
+ return createComponent(Comp, null, {
+ $: [
+ () =>
+ (toggle.value
+ ? {
+ name: val.value,
+ fn: () => {
+ return template('<h1></h1>')()
+ },
+ }
+ : void 0) as DynamicSlot,
+ ],
+ })
+ }).render()
+
+ expect(host.innerHTML).toBe('<div><!--slot--></div>')
+
+ toggle.value = true
+ await nextTick()
+ expect(host.innerHTML).toBe('<div><h1></h1><!--slot--></div>')
+ })
})
})
source = dynamicSources[i]
if (isFunction(source)) {
const slot = source()
- if (isArray(slot)) {
- for (const s of slot) {
- if (s.name === key) return s.fn
+ if (slot) {
+ if (isArray(slot)) {
+ for (const s of slot) {
+ if (s.name === key) return s.fn
+ }
+ } else if (slot.name === key) {
+ return slot.fn
}
- } else if (slot.name === key) {
- return slot.fn
}
} else if (hasOwn(source, key)) {
return source[key]