import type { DynamicSlot } from './componentSlots'
import { renderEffect } from './renderEffect'
import { VaporVForFlags } from '../../shared/src/vaporFlags'
-import { applyTransitionEnterHooks } from './components/Transition'
+import { applyTransitionHooks } from './components/Transition'
class ForBlock extends VaporFragment {
scope: EffectScope | undefined
// apply transition for new nodes
if (frag.$transition) {
- applyTransitionEnterHooks(block.nodes, frag.$transition)
+ applyTransitionHooks(block.nodes, frag.$transition)
}
if (parent) insert(block.nodes, parent, anchor)
performTransitionLeave,
} from '@vue/runtime-dom'
import {
- applyTransitionEnterHooks,
+ applyTransitionHooks,
applyTransitionLeaveHooks,
} from './components/Transition'
this.scope = new EffectScope()
this.nodes = this.scope.run(render) || []
if (transition) {
- this.$transition = applyTransitionEnterHooks(this.nodes, transition)
+ this.$transition = applyTransitionHooks(this.nodes, transition)
}
if (parent) insert(this.nodes, parent, this.anchor)
} else {
let resolvedProps
renderEffect(() => {
resolvedProps = resolveTransitionProps(props)
+ // only update props for Fragment block, for later reusing
if (isFragment(children) && children.$transition) {
children.$transition.props = resolvedProps
+ } else {
+ // replace existing transition hooks
+ const child = findTransitionBlock(children)
+ if (child && child.$transition) {
+ child.$transition.props = resolvedProps
+ applyTransitionHooks(child, child.$transition)
+ }
}
})
- const hooks = {
+ applyTransitionHooks(children, {
state: useTransitionState(),
props: resolvedProps!,
- } as VaporTransitionHooks
- applyTransitionEnterHooks(children, hooks)
+ } as VaporTransitionHooks)
return children
})
return hooks
}
-export function applyTransitionEnterHooks(
+export function applyTransitionHooks(
block: Block,
hooks: VaporTransitionHooks,
): VaporTransitionHooks {
if (!child) return hooks
const { props, state, delayedLeave } = hooks
- let enterHooks = resolveTransitionHooks(
+ let resolvedHooks = resolveTransitionHooks(
child,
props,
state,
currentInstance!,
- hooks => (enterHooks = hooks as VaporTransitionHooks),
+ hooks => (resolvedHooks = hooks as VaporTransitionHooks),
)
- enterHooks.delayedLeave = delayedLeave
- setTransitionHooks(child, enterHooks)
+ resolvedHooks.delayedLeave = delayedLeave
+ setTransitionHooks(child, resolvedHooks)
if (isFragment(block)) {
// also set transition hooks on fragment for reusing during it's updating
- setTransitionHooksToFragment(block, enterHooks)
+ setTransitionHooksToFragment(block, resolvedHooks)
}
- return enterHooks
+ return resolvedHooks
}
export function applyTransitionLeaveHooks(