From a17607049b65d96141f535eadf10f4abbe5a6e05 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Fri, 4 Jul 2025 14:05:41 +0800 Subject: [PATCH 1/2] fix(runtime-vapor): prevent hasOwnProperty error when dynamic prop is null --- packages/runtime-vapor/src/componentProps.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/runtime-vapor/src/componentProps.ts b/packages/runtime-vapor/src/componentProps.ts index 9cf65c57143..b43801272e2 100644 --- a/packages/runtime-vapor/src/componentProps.ts +++ b/packages/runtime-vapor/src/componentProps.ts @@ -186,7 +186,7 @@ export function getAttrFromRawProps(rawProps: RawProps, key: string): unknown { source = dynamicSources[i] isDynamic = isFunction(source) source = isDynamic ? (source as Function)() : source - if (hasOwn(source, key)) { + if (source && hasOwn(source, key)) { const value = isDynamic ? source[key] : source[key]() if (merged) { merged.push(value) From af1f08cba5d8262594dc9d72f57aac2c546bbe19 Mon Sep 17 00:00:00 2001 From: zhiyuanzmj <260480378@qq.com> Date: Fri, 4 Jul 2025 16:15:09 +0800 Subject: [PATCH 2/2] chore: add test --- .../__tests__/vdomInterop.spec.ts | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/runtime-vapor/__tests__/vdomInterop.spec.ts b/packages/runtime-vapor/__tests__/vdomInterop.spec.ts index 08326d4d5d9..f70b7439e5c 100644 --- a/packages/runtime-vapor/__tests__/vdomInterop.spec.ts +++ b/packages/runtime-vapor/__tests__/vdomInterop.spec.ts @@ -5,7 +5,26 @@ import { createComponent, defineVaporComponent } from '../src' const define = makeInteropRender() describe('vdomInterop', () => { - describe.todo('props', () => {}) + describe('props', () => { + test('prevent hasOwnProperty error when props is null', () => { + const VaporChild = defineVaporComponent({ + props: { + msg: String, + }, + setup(_, { attrs }) { + return [document.createTextNode(attrs.class || 'foo')] + }, + }) + + const { html } = define({ + setup() { + return () => h(VaporChild as any) + }, + }).render() + + expect(html()).toBe('foo') + }) + }) describe.todo('emit', () => {})