From: 三咲智子 Kevin Deng Date: Fri, 19 Jan 2024 14:43:43 +0000 (+0800) Subject: fix(runtime-vapor): normalize state&block X-Git-Tag: v3.6.0-alpha.1~16^2~673 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fc651f6905af71e20a92822f04b81d5080c5dedd;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-vapor): normalize state&block --- diff --git a/packages/runtime-vapor/src/render.ts b/packages/runtime-vapor/src/render.ts index 82c8c02e79..24051277e3 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