From 89158d7a7ceacb0a350848496230a4a0fab54c55 Mon Sep 17 00:00:00 2001 From: HcySunYang Date: Wed, 26 Aug 2020 11:09:26 +0800 Subject: [PATCH 1/3] fix: class and style should be properly normalized in cloneVNode --- packages/runtime-core/src/vnode.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index b444215ca26..0f20a534675 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, From 6cb54fb47f7368d307882056406e87cff6f03324 Mon Sep 17 00:00:00 2001 From: HcySunYang Date: Wed, 26 Aug 2020 13:40:44 +0800 Subject: [PATCH 2/3] test: add tests for cloneVNode --- packages/runtime-core/__tests__/vnode.spec.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/packages/runtime-core/__tests__/vnode.spec.ts b/packages/runtime-core/__tests__/vnode.spec.ts index 2cab3215d40..b3e2c94fe0d 100644 --- a/packages/runtime-core/__tests__/vnode.spec.ts +++ b/packages/runtime-core/__tests__/vnode.spec.ts @@ -265,6 +265,54 @@ describe('vnode', () => { setCurrentRenderingInstance(null) }) + test('cloneVNode class normalization', () => { + const vnode = createVNode('div', { class: 'a' }) + const expectedProps = { + class: 'a b' + } + expect(cloneVNode(vnode, { class: 'b' }).props).toMatchObject(expectedProps) + expect(cloneVNode(vnode, { class: ['b'] }).props).toMatchObject( + expectedProps + ) + expect(cloneVNode(vnode, { class: { b: true } }).props).toMatchObject( + expectedProps + ) + expect(cloneVNode(vnode, { class: [{ b: true }] }).props).toMatchObject( + expectedProps + ) + }) + + test('cloneVNode style normalization', () => { + const vnode = createVNode('div', { style: 'color: red;' }) + 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' } From 9b48f9305e1f3b411c00e54d8eb79b78cef4ca1b Mon Sep 17 00:00:00 2001 From: HcySunYang Date: Wed, 26 Aug 2020 15:20:24 +0800 Subject: [PATCH 3/3] chore: tweak the tests --- packages/runtime-core/__tests__/vnode.spec.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/runtime-core/__tests__/vnode.spec.ts b/packages/runtime-core/__tests__/vnode.spec.ts index b3e2c94fe0d..ad3575610a9 100644 --- a/packages/runtime-core/__tests__/vnode.spec.ts +++ b/packages/runtime-core/__tests__/vnode.spec.ts @@ -266,24 +266,26 @@ describe('vnode', () => { }) test('cloneVNode class normalization', () => { - const vnode = createVNode('div', { class: 'a' }) + const vnode = createVNode('div') const expectedProps = { class: 'a b' } - expect(cloneVNode(vnode, { class: 'b' }).props).toMatchObject(expectedProps) - expect(cloneVNode(vnode, { class: ['b'] }).props).toMatchObject( - expectedProps - ) - expect(cloneVNode(vnode, { class: { b: true } }).props).toMatchObject( + expect(cloneVNode(vnode, { class: 'a b' }).props).toMatchObject( expectedProps ) - expect(cloneVNode(vnode, { class: [{ b: true }] }).props).toMatchObject( + 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', { style: 'color: red;' }) + const vnode = createVNode('div') const expectedProps = { style: { color: 'blue',