]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: save
authordaiwei <daiwei521@126.com>
Wed, 5 Mar 2025 08:06:00 +0000 (16:06 +0800)
committerdaiwei <daiwei521@126.com>
Wed, 5 Mar 2025 08:06:00 +0000 (16:06 +0800)
packages/runtime-dom/src/components/Transition.ts
packages/runtime-vapor/src/component.ts
packages/runtime-vapor/src/componentSlots.ts
packages/runtime-vapor/src/components/Transition.ts
packages/runtime-vapor/src/vdomInterop.ts

index 4b33566e3792e1a51616b933dd331d7632e15254..3d8ac9dc8b3d75faf7bab1fc099eaa5b994b2abb 100644 (file)
@@ -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<TransitionProps> =
   /*@__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)
   })
 
 /**
index 3c39612bb89d77ae185f6a4b278adec5377a5122..2eae68e5fe57c29f78c86ef878e56f112aae99e3 100644 (file)
@@ -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
   }
 
index 9f6c2ba5a0dc56010f259dde510c4a23b7fa4470..0dd1329e44ac939434fd83a665ab0dca94d36b98 100644 (file)
@@ -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<any> = {
+  get(target, key) {
+    if (key === '_vapor') {
+      return target
+    } else {
+      return target[key]
+    }
+  },
+}
+
 export const dynamicSlotsProxyHandlers: ProxyHandler<RawSlots> = {
-  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)
index a7f540fa6aec912da3eabbe5952de6c0b75ff484..f6491aee3566883149f2ceb979637bbd9f852e0e 100644 (file)
@@ -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
 
index 77228fd72a02fe85a5496daf7d89bc37e197a4d2..b4ed4cb4d521f9dfd4a223b99f9eee8d419ae01d 100644 (file)
@@ -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<any> = {
-  get(target, key) {
-    if (key === '_vapor') {
-      return target
-    } else {
-      return target[key]
-    }
-  },
-}
-
 /**
  * Mount vdom component in vapor
  */