From: 三咲智子 Kevin Deng Date: Fri, 15 Nov 2024 18:43:56 +0000 (+0800) Subject: refactor(runtime-vapor): extract fallback component X-Git-Tag: v3.6.0-alpha.1~16^2~275 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d84510844f9f56703a5c66e4180fea228253d009;p=thirdparty%2Fvuejs%2Fcore.git refactor(runtime-vapor): extract fallback component --- diff --git a/packages/runtime-vapor/src/apiCreateComponent.ts b/packages/runtime-vapor/src/apiCreateComponent.ts index 8f19e6b328..62681c9058 100644 --- a/packages/runtime-vapor/src/apiCreateComponent.ts +++ b/packages/runtime-vapor/src/apiCreateComponent.ts @@ -5,19 +5,11 @@ import { currentInstance, } from './component' import { setupComponent } from './apiRender' -import { - type NormalizedRawProps, - type RawProps, - normalizeRawProps, - walkRawProps, -} from './componentProps' -import { type RawSlots, isDynamicSlotFn } from './componentSlots' +import type { RawProps } from './componentProps' +import type { RawSlots } from './componentSlots' import { withAttrs } from './componentAttrs' import { isString } from '@vue/shared' -import { renderEffect } from './renderEffect' -import { setClass, setDynamicProp } from './dom/prop' -import { setStyle } from './dom/style' -import { normalizeBlock } from './block' +import { fallbackComponent } from './componentFallback' export function createComponent( comp: Component | string, @@ -50,60 +42,3 @@ export function createComponent( return instance } - -function fallbackComponent( - comp: string, - rawProps: RawProps | null, - slots: RawSlots | null, - instance: ComponentInternalInstance, - singleRoot: boolean = false, -): HTMLElement { - // eslint-disable-next-line no-restricted-globals - const el = document.createElement(comp) - - if (rawProps || Object.keys(instance.attrs).length) { - rawProps = [() => instance.attrs, ...normalizeRawProps(rawProps)] - - renderEffect(() => { - let classes: unknown[] | undefined - let styles: unknown[] | undefined - - walkRawProps( - rawProps as NormalizedRawProps, - (key, valueOrGetter, getter) => { - const value = getter ? valueOrGetter() : valueOrGetter - if (key === 'class') (classes ||= []).push(value) - else if (key === 'style') (styles ||= []).push(value) - else setDynamicProp(el, key, value) - }, - ) - - if (classes) setClass(el, classes) - if (styles) setStyle(el, styles) - }) - } - - if (slots) { - if (!Array.isArray(slots)) slots = [slots] - for (let i = 0; i < slots.length; i++) { - const slot = slots[i] - if (!isDynamicSlotFn(slot) && slot.default) { - const block = slot.default && slot.default() - if (block) el.append(...normalizeBlock(block)) - } - } - } - - if (singleRoot) { - instance.dynamicAttrs = true - for (let i = 0; i < instance.scopeIds.length; i++) { - const id = instance.scopeIds[i] - el.setAttribute(id, '') - } - } - - const scopeId = instance.type.__scopeId - if (scopeId) el.setAttribute(scopeId, '') - - return el -} diff --git a/packages/runtime-vapor/src/apiSetupHelpers.ts b/packages/runtime-vapor/src/apiSetupHelpers.ts index 4afd430468..1737f6ec4c 100644 --- a/packages/runtime-vapor/src/apiSetupHelpers.ts +++ b/packages/runtime-vapor/src/apiSetupHelpers.ts @@ -5,8 +5,6 @@ import { } from './component' import { warn } from './warning' -// TODO: warning compiler-macros runtime usages - export function useSlots(): SetupContext['slots'] { return getContext().slots } diff --git a/packages/runtime-vapor/src/componentFallback.ts b/packages/runtime-vapor/src/componentFallback.ts new file mode 100644 index 0000000000..adceb5446e --- /dev/null +++ b/packages/runtime-vapor/src/componentFallback.ts @@ -0,0 +1,69 @@ +import type { ComponentInternalInstance } from './component' +import { + type NormalizedRawProps, + type RawProps, + normalizeRawProps, + walkRawProps, +} from './componentProps' +import { type RawSlots, isDynamicSlotFn } from './componentSlots' +import { renderEffect } from './renderEffect' +import { setClass, setDynamicProp } from './dom/prop' +import { setStyle } from './dom/style' +import { normalizeBlock } from './block' + +export function fallbackComponent( + comp: string, + rawProps: RawProps | null, + slots: RawSlots | null, + instance: ComponentInternalInstance, + singleRoot: boolean = false, +): HTMLElement { + // eslint-disable-next-line no-restricted-globals + const el = document.createElement(comp) + + if (rawProps || Object.keys(instance.attrs).length) { + rawProps = [() => instance.attrs, ...normalizeRawProps(rawProps)] + + renderEffect(() => { + let classes: unknown[] | undefined + let styles: unknown[] | undefined + + walkRawProps( + rawProps as NormalizedRawProps, + (key, valueOrGetter, getter) => { + const value = getter ? valueOrGetter() : valueOrGetter + if (key === 'class') (classes ||= []).push(value) + else if (key === 'style') (styles ||= []).push(value) + else setDynamicProp(el, key, value) + }, + ) + + if (classes) setClass(el, classes) + if (styles) setStyle(el, styles) + }) + } + + if (slots) { + if (!Array.isArray(slots)) slots = [slots] + for (let i = 0; i < slots.length; i++) { + const slot = slots[i] + if (!isDynamicSlotFn(slot) && slot.default) { + const block = slot.default && slot.default() + if (block) el.append(...normalizeBlock(block)) + } + } + } + + if (singleRoot) { + instance.dynamicAttrs = true + for (let i = 0; i < instance.scopeIds.length; i++) { + const id = instance.scopeIds[i] + el.setAttribute(id, '') + } + } + + const scopeId = instance.type.__scopeId + if (scopeId) el.setAttribute(scopeId, '') + + return el +}