Skip to content

Commit 51677cd

Browse files
committed
Merge branch 'interop-slot' into jsx-vapor
2 parents 715b798 + 4d05dfd commit 51677cd

File tree

3 files changed

+73
-8
lines changed

3 files changed

+73
-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: 61 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 { createVNode, defineComponent, h, renderSlot } from '@vue/runtime-dom'
22
import { makeInteropRender } from './_utils'
33
import { createComponent, defineVaporComponent } from '../src'
44

@@ -28,7 +28,66 @@ describe('vdomInterop', () => {
2828

2929
describe.todo('emit', () => {})
3030

31-
describe.todo('slots', () => {})
31+
describe('slots', () => {
32+
test('basic', () => {
33+
const VDomChild = defineComponent({
34+
setup(_, { slots }) {
35+
return () => renderSlot(slots, 'default')
36+
},
37+
})
38+
39+
const VaporChild = defineVaporComponent({
40+
setup() {
41+
return createComponent(
42+
VDomChild as any,
43+
null,
44+
{
45+
default: () => document.createTextNode('default slot'),
46+
},
47+
true,
48+
)
49+
},
50+
})
51+
52+
const { html } = define({
53+
setup() {
54+
return () => h(VaporChild as any)
55+
},
56+
}).render()
57+
58+
expect(html()).toBe('default slot')
59+
})
60+
61+
test('functional slot', () => {
62+
const VDomChild = defineComponent({
63+
setup(_, { slots }) {
64+
console.log(slots.default)
65+
return () => createVNode(slots.default!)
66+
},
67+
})
68+
69+
const VaporChild = defineVaporComponent({
70+
setup() {
71+
return createComponent(
72+
VDomChild as any,
73+
null,
74+
{
75+
default: () => document.createTextNode('default slot'),
76+
},
77+
true,
78+
)
79+
},
80+
})
81+
82+
const { html } = define({
83+
setup() {
84+
return () => h(VaporChild as any)
85+
},
86+
}).render()
87+
88+
expect(html()).toBe('default slot')
89+
})
90+
})
3291

3392
describe.todo('provide', () => {})
3493

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)