Procházet zdrojové kódy

fix(runtime-core): class and style should be properly normalized in cloneVNode (#1967)

fix #1964
HcySunYang před 5 roky
rodič
revize
9153fc2d8a

+ 50 - 0
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' }

+ 1 - 5
packages/runtime-core/src/vnode.ts

@@ -433,11 +433,7 @@ export function cloneVNode<T, U>(
   // 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,