From: edison Date: Thu, 26 Sep 2024 09:08:48 +0000 (+0800) Subject: fix(runtime-core): avoid rendering plain object as VNode (#12038) X-Git-Tag: v3.5.9~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb34b28a4a9bf868be4785b001c526163eda342e;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): avoid rendering plain object as VNode (#12038) close #12035 close vitejs/vite-plugin-vue#353 --- diff --git a/packages/runtime-core/__tests__/rendererChildren.spec.ts b/packages/runtime-core/__tests__/rendererChildren.spec.ts index 47024b674f..2c3e5ff0d1 100644 --- a/packages/runtime-core/__tests__/rendererChildren.spec.ts +++ b/packages/runtime-core/__tests__/rendererChildren.spec.ts @@ -65,6 +65,15 @@ test('array children -> text children', () => { expect(inner(root)).toBe('
hello
') }) +test('plain object child', () => { + const root = nodeOps.createElement('div') + const foo = { foo: '1' } + // @ts-expect-error + render(h('div', null, [foo]), root) + expect('Invalid VNode type').not.toHaveBeenWarned() + expect(inner(root)).toBe('
[object Object]
') +}) + describe('renderer: keyed children', () => { let root: TestElement let elm: TestElement diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index 57c0cf8b7d..30200789be 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -793,7 +793,7 @@ export function normalizeVNode(child: VNodeChild): VNode { // #3666, avoid reference pollution when reusing vnode child.slice(), ) - } else if (typeof child === 'object') { + } else if (isVNode(child)) { // already vnode, this should be the most common since compiled templates // always produce all-vnode children arrays return cloneIfMounted(child)