From e3f8ba4bf5451d8820af091eef04f50ff2179ab2 Mon Sep 17 00:00:00 2001 From: daiwei Date: Wed, 5 Mar 2025 16:06:00 +0800 Subject: [PATCH] wip: save --- .../runtime-dom/src/components/Transition.ts | 17 +++++------------ packages/runtime-vapor/src/component.ts | 3 ++- packages/runtime-vapor/src/componentSlots.ts | 18 +++++++++++++++++- .../runtime-vapor/src/components/Transition.ts | 2 +- packages/runtime-vapor/src/vdomInterop.ts | 16 +++++----------- 5 files changed, 30 insertions(+), 26 deletions(-) diff --git a/packages/runtime-dom/src/components/Transition.ts b/packages/runtime-dom/src/components/Transition.ts index 4b33566e37..3d8ac9dc8b 100644 --- a/packages/runtime-dom/src/components/Transition.ts +++ b/packages/runtime-dom/src/components/Transition.ts @@ -7,7 +7,6 @@ import { assertNumber, compatUtils, h, - isVNode, } from '@vue/runtime-core' import { extend, isArray, isObject, toNumber } from '@vue/shared' @@ -37,7 +36,7 @@ export interface VaporTransitionInterface { applyTransition: ( props: TransitionProps, slots: { default: () => any }, - ) => void + ) => any } let vaporTransitionImpl: VaporTransitionInterface | null = null @@ -101,19 +100,13 @@ const decorate = (t: typeof Transition) => { */ export const Transition: FunctionalComponent = /*@__PURE__*/ decorate((props, { slots }) => { - const children = slots.default && slots.default() - const isVNodeChildren = isArray(children) && children.some(c => isVNode(c)) const resolvedProps = resolveTransitionProps(props) - if (isVNodeChildren) { - return h(BaseTransition, resolvedProps, { - default: () => children, - }) + if (slots._vapor) { + // vapor transition + return vaporTransitionImpl!.applyTransition(resolvedProps, slots as any) } - // vapor transition - return vaporTransitionImpl!.applyTransition(resolvedProps, { - default: () => children, - }) + return h(BaseTransition, resolvedProps, slots) }) /** diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts index 3c39612bb8..2eae68e5fe 100644 --- a/packages/runtime-vapor/src/component.ts +++ b/packages/runtime-vapor/src/component.ts @@ -56,6 +56,7 @@ import { type VaporSlot, dynamicSlotsProxyHandlers, getSlot, + vaporSlotsProxyHandler, } from './componentSlots' import { hmrReload, hmrRerender } from './hmr' @@ -416,7 +417,7 @@ export class VaporComponentInstance implements GenericComponentInstance { this.slots = rawSlots ? rawSlots.$ ? new Proxy(rawSlots, dynamicSlotsProxyHandlers) - : rawSlots + : new Proxy(rawSlots, vaporSlotsProxyHandler) : EMPTY_OBJ } diff --git a/packages/runtime-vapor/src/componentSlots.ts b/packages/runtime-vapor/src/componentSlots.ts index 9f6c2ba5a0..0dd1329e44 100644 --- a/packages/runtime-vapor/src/componentSlots.ts +++ b/packages/runtime-vapor/src/componentSlots.ts @@ -16,8 +16,24 @@ export type DynamicSlot = { name: string; fn: VaporSlot } export type DynamicSlotFn = () => DynamicSlot | DynamicSlot[] export type DynamicSlotSource = StaticSlots | DynamicSlotFn +export const vaporSlotsProxyHandler: ProxyHandler = { + get(target, key) { + if (key === '_vapor') { + return target + } else { + return target[key] + } + }, +} + export const dynamicSlotsProxyHandlers: ProxyHandler = { - get: getSlot, + get: (target, key: string) => { + if (key === '_vapor') { + return target + } else { + return getSlot(target, key) + } + }, has: (target, key: string) => !!getSlot(target, key), getOwnPropertyDescriptor(target, key: string) { const slot = getSlot(target, key) diff --git a/packages/runtime-vapor/src/components/Transition.ts b/packages/runtime-vapor/src/components/Transition.ts index a7f540fa6a..f6491aee35 100644 --- a/packages/runtime-vapor/src/components/Transition.ts +++ b/packages/runtime-vapor/src/components/Transition.ts @@ -26,7 +26,7 @@ export const vaporTransitionImpl: VaporTransitionInterface = { applyTransition: ( props: TransitionProps, slots: { default: () => Block }, - ) => { + ): Block | undefined => { const children = slots.default && slots.default() if (!children) return diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts index 77228fd72a..b4ed4cb4d5 100644 --- a/packages/runtime-vapor/src/vdomInterop.ts +++ b/packages/runtime-vapor/src/vdomInterop.ts @@ -29,7 +29,11 @@ import { import { type Block, VaporFragment, insert, remove } from './block' import { EMPTY_OBJ, extend, isFunction } from '@vue/shared' import { type RawProps, rawPropsProxyHandlers } from './componentProps' -import type { RawSlots, VaporSlot } from './componentSlots' +import { + type RawSlots, + type VaporSlot, + vaporSlotsProxyHandler, +} from './componentSlots' import { renderEffect } from './renderEffect' import { createTextNode } from './dom/node' import { optimizePropertyLookup } from './dom/prop' @@ -129,16 +133,6 @@ const vaporSlotPropsProxyHandler: ProxyHandler< }, } -const vaporSlotsProxyHandler: ProxyHandler = { - get(target, key) { - if (key === '_vapor') { - return target - } else { - return target[key] - } - }, -} - /** * Mount vdom component in vapor */ -- 2.47.2