From: HcySunYang Date: Wed, 26 Aug 2020 13:37:28 +0000 (+0800) Subject: fix(runtime-core): class and style should be properly normalized in cloneVNode (... X-Git-Tag: v3.0.0-rc.9~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9153fc2d8a5c9d24d79161586c70840ae7b84b8b;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): class and style should be properly normalized in cloneVNode (#1967) fix #1964 --- diff --git a/packages/runtime-core/__tests__/vnode.spec.ts b/packages/runtime-core/__tests__/vnode.spec.ts index 2cab3215d4..ad3575610a 100644 --- a/packages/runtime-core/__tests__/vnode.spec.ts +++ b/packages/runtime-core/__tests__/vnode.spec.ts @@ -265,6 +265,56 @@ describe('vnode', () => { setCurrentRenderingInstance(null) }) + test('cloneVNode class normalization', () => { + const vnode = createVNode('div') + const expectedProps = { + class: 'a b' + } + expect(cloneVNode(vnode, { class: 'a b' }).props).toMatchObject( + expectedProps + ) + expect(cloneVNode(vnode, { class: ['a', 'b'] }).props).toMatchObject( + expectedProps + ) + expect( + cloneVNode(vnode, { class: { a: true, b: true } }).props + ).toMatchObject(expectedProps) + expect( + cloneVNode(vnode, { class: [{ a: true, b: true }] }).props + ).toMatchObject(expectedProps) + }) + + test('cloneVNode style normalization', () => { + const vnode = createVNode('div') + const expectedProps = { + style: { + color: 'blue', + width: '300px' + } + } + expect( + cloneVNode(vnode, { style: 'color: blue; width: 300px;' }).props + ).toMatchObject(expectedProps) + expect( + cloneVNode(vnode, { + style: { + color: 'blue', + width: '300px' + } + }).props + ).toMatchObject(expectedProps) + expect( + cloneVNode(vnode, { + style: [ + { + color: 'blue', + width: '300px' + } + ] + }).props + ).toMatchObject(expectedProps) + }) + describe('mergeProps', () => { test('class', () => { let props1: Data = { class: 'c' } diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index b444215ca2..0f20a53467 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -433,11 +433,7 @@ export function cloneVNode( // This is intentionally NOT using spread or extend to avoid the runtime // key enumeration cost. const { props, patchFlag } = vnode - const mergedProps = extraProps - ? props - ? mergeProps(props, extraProps) - : extend({}, extraProps) - : props + const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props return { __v_isVNode: true, [ReactiveFlags.SKIP]: true,