From fc651f6905af71e20a92822f04b81d5080c5dedd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Fri, 19 Jan 2024 22:43:43 +0800 Subject: [PATCH] fix(runtime-vapor): normalize state&block --- packages/runtime-vapor/src/render.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/runtime-vapor/src/render.ts b/packages/runtime-vapor/src/render.ts index 82c8c02e7..24051277e 100644 --- a/packages/runtime-vapor/src/render.ts +++ b/packages/runtime-vapor/src/render.ts @@ -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