Skip to content

Commit 26dbd3c

Browse files
committed
fix(vapor): component emits vdom interop
1 parent 88ef97f commit 26dbd3c

File tree

4 files changed

+39
-4
lines changed

4 files changed

+39
-4
lines changed

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

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,18 @@
44
// ./rendererAttrsFallthrough.spec.ts.
55

66
import {
7+
createApp,
8+
h,
79
isEmitListener,
810
nextTick,
911
onBeforeUnmount,
1012
toHandlers,
1113
} from '@vue/runtime-dom'
12-
import { createComponent, defineVaporComponent } from '../src'
14+
import {
15+
createComponent,
16+
defineVaporComponent,
17+
vaporInteropPlugin,
18+
} from '../src'
1319
import { makeRender } from './_utils'
1420

1521
const define = makeRender()
@@ -425,3 +431,28 @@ describe('component: emit', () => {
425431
expect(fn).not.toHaveBeenCalled()
426432
})
427433
})
434+
435+
describe('vdom interop', () => {
436+
test('vdom parent > vapor child', () => {
437+
const VaporChild = defineVaporComponent({
438+
emits: ['click'],
439+
setup(_, { emit }) {
440+
emit('click')
441+
return []
442+
},
443+
})
444+
445+
const fn = vi.fn()
446+
const App = {
447+
setup() {
448+
return () => h(VaporChild as any, { onClick: fn })
449+
},
450+
}
451+
452+
const root = document.createElement('div')
453+
createApp(App).use(vaporInteropPlugin).mount(root)
454+
455+
// fn should be called once
456+
expect(fn).toHaveBeenCalledTimes(1)
457+
})
458+
})

packages/runtime-vapor/src/componentEmits.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ function propGetter(rawProps: Record<string, any>, key: string) {
4646
let i = dynamicSources.length
4747
while (i--) {
4848
const source = resolveSource(dynamicSources[i])
49-
if (hasOwn(source, key)) return resolveSource(source[key])
49+
if (hasOwn(source, key))
50+
// for props passed from VDOM component, no need to resolve
51+
return dynamicSources.__interop
52+
? source[key]
53+
: resolveSource(source[key])
5054
}
5155
}
5256
return rawProps[key] && resolveSource(rawProps[key])

packages/runtime-vapor/src/componentProps.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { renderEffect } from './renderEffect'
2626

2727
export type RawProps = Record<string, () => unknown> & {
2828
// generated by compiler for :[key]="x" or v-bind="x"
29-
$?: DynamicPropsSource[]
29+
$?: DynamicPropsSource[] & { __interop?: boolean }
3030
}
3131

3232
export type DynamicPropsSource =

packages/runtime-vapor/src/vdomInterop.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const vaporInteropImpl: Omit<
5252
const instance = (vnode.component = createComponent(
5353
vnode.type as any as VaporComponent,
5454
{
55-
$: [() => propsRef.value],
55+
$: extend([() => propsRef.value], { __interop: true }),
5656
} as RawProps,
5757
{
5858
_: slotsRef, // pass the slots ref

0 commit comments

Comments
 (0)