]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-vapor): normalize state&block
author三咲智子 Kevin Deng <sxzz@sxzz.moe>
Fri, 19 Jan 2024 14:43:43 +0000 (22:43 +0800)
committer三咲智子 Kevin Deng <sxzz@sxzz.moe>
Fri, 19 Jan 2024 14:43:43 +0000 (22:43 +0800)
packages/runtime-vapor/src/render.ts

index 82c8c02e7991bfcbfd9cd1699e5a0aa33a0748af..24051277e34f4ae7556d5d895eaded15a4f54f42 100644 (file)
@@ -1,5 +1,5 @@
 import { proxyRefs } from '@vue/reactivity'
-import { type Data, invokeArrayFns } from '@vue/shared'
+import { type Data, invokeArrayFns, isArray, isObject } from '@vue/shared'
 import {
   type Component,
   type ComponentInternalInstance,
@@ -46,17 +46,27 @@ export function mountComponent(
 
     const setupFn =
       typeof component === 'function' ? component : component.setup
-    const state = setupFn && setupFn(props, ctx)
-    let block: Block | null = null
-    if (state && '__isScriptSetup' in state) {
-      instance.setupState = proxyRefs(state)
-      block = component.render(instance.setupState)
-    } else {
-      block = state as Block
+    const stateOrNode = setupFn && setupFn(props, ctx)
+
+    let block: Block | undefined
+    let setupState: Data | undefined
+
+    if (stateOrNode instanceof Node) {
+      block = stateOrNode
+    } else if (isObject(stateOrNode) && !isArray(stateOrNode)) {
+      setupState = proxyRefs(stateOrNode)
+    }
+    if (!block && component.render) {
+      block = component.render(setupState)
     }
+
     if (block instanceof DocumentFragment) {
       block = Array.from(block.childNodes)
     }
+    if (!block) {
+      // TODO: warn no template
+      block = []
+    }
     return (instance.block = block)
   })!
   const { bm, m } = instance