Skip to content

Commit a359aff

Browse files
committed
feat(runtime-vapor): support functional slot in vdom component
1 parent 3a3bd84 commit a359aff

File tree

3 files changed

+43
-8
lines changed

3 files changed

+43
-8
lines changed

packages/runtime-core/src/helpers/renderSlot.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export function renderSlot(
3535
let slot = slots[name]
3636

3737
// vapor slots rendered in vdom
38-
if (slot && slots._vapor) {
38+
if (slot && (slot as any).__vapor) {
3939
const ret = (openBlock(), createBlock(VaporSlot, props))
4040
ret.vs = { slot, fallback }
4141
return ret

packages/runtime-vapor/__tests__/vdomInterop.spec.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineComponent, h } from '@vue/runtime-dom'
1+
import { defineComponent, h, renderSlot } from '@vue/runtime-dom'
22
import { makeInteropRender } from './_utils'
33
import { createComponent, defineVaporComponent } from '../src'
44

@@ -9,7 +9,36 @@ describe('vdomInterop', () => {
99

1010
describe.todo('emit', () => {})
1111

12-
describe.todo('slots', () => {})
12+
describe('slots', () => {
13+
test('functional slot', () => {
14+
const VDomChild = defineComponent({
15+
setup(_, { slots }) {
16+
return () => renderSlot(slots, 'default')
17+
},
18+
})
19+
20+
const VaporChild = defineVaporComponent({
21+
setup() {
22+
return createComponent(
23+
VDomChild as any,
24+
null,
25+
{
26+
default: () => document.createTextNode('default slot'),
27+
},
28+
true,
29+
)
30+
},
31+
})
32+
33+
const { html } = define({
34+
setup() {
35+
return () => h(VaporChild as any)
36+
},
37+
}).render()
38+
39+
expect(html()).toBe('default slot')
40+
})
41+
})
1342

1443
describe.todo('provide', () => {})
1544

packages/runtime-vapor/src/vdomInterop.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,17 @@ const vaporSlotPropsProxyHandler: ProxyHandler<
134134

135135
const vaporSlotsProxyHandler: ProxyHandler<any> = {
136136
get(target, key) {
137-
if (key === '_vapor') {
138-
return target
139-
} else {
140-
return target[key]
141-
}
137+
const fn = target[key]
138+
return isFunction(fn)
139+
? new Proxy(fn, {
140+
get(fnTarget, fnKey) {
141+
if (fnKey === '__vapor') {
142+
return true
143+
}
144+
return fnTarget[fnKey]
145+
},
146+
})
147+
: fn
142148
},
143149
}
144150

0 commit comments

Comments
 (0)