Przeglądaj źródła

feat(runtime-core): support variadic children in `h` for simple JSX compat

ref: #1917
Evan You 5 lat temu
rodzic
commit
54d06ec495

+ 16 - 0
packages/runtime-core/__tests__/h.spec.ts

@@ -64,4 +64,20 @@ describe('renderer: h', () => {
       })
     )
   })
+
+  // for simple JSX compat
+  // note this signature is not supported in types; it's purely for usage with
+  // compiled code.
+  test('support variadic children', () => {
+    // @ts-ignore
+    const vnode = h('div', null, h('span'), h('span'))
+    expect(vnode.children).toMatchObject([
+      {
+        type: 'span'
+      },
+      {
+        type: 'span'
+      }
+    ])
+  })
 })

+ 5 - 2
packages/runtime-core/src/h.ts

@@ -129,7 +129,8 @@ export function h<P>(
 
 // Actual implementation
 export function h(type: any, propsOrChildren?: any, children?: any): VNode {
-  if (arguments.length === 2) {
+  const l = arguments.length
+  if (l === 2) {
     if (isObject(propsOrChildren) && !isArray(propsOrChildren)) {
       // single vnode without props
       if (isVNode(propsOrChildren)) {
@@ -142,7 +143,9 @@ export function h(type: any, propsOrChildren?: any, children?: any): VNode {
       return createVNode(type, null, propsOrChildren)
     }
   } else {
-    if (isVNode(children)) {
+    if (l > 3) {
+      children = Array.prototype.slice.call(arguments, 2)
+    } else if (l === 3 && isVNode(children)) {
       children = [children]
     }
     return createVNode(type, propsOrChildren, children)