wip: save

This commit is contained in:
daiwei 2025-03-05 16:06:00 +08:00
parent b92ea0a38a
commit e3f8ba4bf5
5 changed files with 30 additions and 26 deletions

View 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)
})
/**

View 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
}

View 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)

View 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

View 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
*/