Prechádzať zdrojové kódy

fix(runtime-vapor): handle vapor attrs fallthrough to vdom component (#13551)

edison 9 mesiacov pred
rodič
commit
5ce227bd22

+ 26 - 0
packages/runtime-vapor/__tests__/vdomInterop.spec.ts

@@ -214,6 +214,32 @@ describe('vdomInterop', () => {
   describe.todo('dynamic component', () => {})
 
   describe('attribute fallthrough', () => {
+    it('should fallthrough attrs to vdom child', () => {
+      const VDomChild = defineComponent({
+        setup() {
+          return () => h('div')
+        },
+      })
+
+      const VaporChild = defineVaporComponent({
+        setup() {
+          return createComponent(
+            VDomChild as any,
+            { foo: () => 'vapor foo' },
+            null,
+            true,
+          )
+        },
+      })
+
+      const { html } = define({
+        setup() {
+          return () => h(VaporChild as any, { foo: 'foo', bar: 'bar' })
+        },
+      }).render()
+      expect(html()).toBe('<div foo="foo" bar="bar"></div>')
+    })
+
     it('should not fallthrough emit handlers to vdom child', () => {
       const VDomChild = defineComponent({
         emits: ['click'],

+ 13 - 13
packages/runtime-vapor/src/component.ts

@@ -149,19 +149,6 @@ export function createComponent(
     resetInsertionState()
   }
 
-  // vdom interop enabled and component is not an explicit vapor component
-  if (appContext.vapor && !component.__vapor) {
-    const frag = appContext.vapor.vdomMount(
-      component as any,
-      rawProps,
-      rawSlots,
-    )
-    if (!isHydrating && _insertionParent) {
-      insert(frag, _insertionParent, _insertionAnchor)
-    }
-    return frag
-  }
-
   if (
     isSingleRoot &&
     component.inheritAttrs !== false &&
@@ -180,6 +167,19 @@ export function createComponent(
     }
   }
 
+  // vdom interop enabled and component is not an explicit vapor component
+  if (appContext.vapor && !component.__vapor) {
+    const frag = appContext.vapor.vdomMount(
+      component as any,
+      rawProps,
+      rawSlots,
+    )
+    if (!isHydrating && _insertionParent) {
+      insert(frag, _insertionParent, _insertionAnchor)
+    }
+    return frag
+  }
+
   const instance = new VaporComponentInstance(
     component,
     rawProps as RawProps,