wip: handle props update

This commit is contained in:
daiwei 2025-03-13 11:09:21 +08:00
parent af2eb2dbf5
commit 1540002f32
3 changed files with 21 additions and 14 deletions

View File

@ -22,7 +22,7 @@ import { currentInstance, isVaporComponent } from './component'
import type { DynamicSlot } from './componentSlots' import type { DynamicSlot } from './componentSlots'
import { renderEffect } from './renderEffect' import { renderEffect } from './renderEffect'
import { VaporVForFlags } from '../../shared/src/vaporFlags' import { VaporVForFlags } from '../../shared/src/vaporFlags'
import { applyTransitionEnterHooks } from './components/Transition' import { applyTransitionHooks } from './components/Transition'
class ForBlock extends VaporFragment { class ForBlock extends VaporFragment {
scope: EffectScope | undefined scope: EffectScope | undefined
@ -318,7 +318,7 @@ export const createFor = (
// apply transition for new nodes // apply transition for new nodes
if (frag.$transition) { if (frag.$transition) {
applyTransitionEnterHooks(block.nodes, frag.$transition) applyTransitionHooks(block.nodes, frag.$transition)
} }
if (parent) insert(block.nodes, parent, anchor) if (parent) insert(block.nodes, parent, anchor)

View File

@ -16,7 +16,7 @@ import {
performTransitionLeave, performTransitionLeave,
} from '@vue/runtime-dom' } from '@vue/runtime-dom'
import { import {
applyTransitionEnterHooks, applyTransitionHooks,
applyTransitionLeaveHooks, applyTransitionLeaveHooks,
} from './components/Transition' } from './components/Transition'
@ -85,7 +85,7 @@ export class DynamicFragment extends VaporFragment {
this.scope = new EffectScope() this.scope = new EffectScope()
this.nodes = this.scope.run(render) || [] this.nodes = this.scope.run(render) || []
if (transition) { if (transition) {
this.$transition = applyTransitionEnterHooks(this.nodes, transition) this.$transition = applyTransitionHooks(this.nodes, transition)
} }
if (parent) insert(this.nodes, parent, this.anchor) if (parent) insert(this.nodes, parent, this.anchor)
} else { } else {

View File

@ -43,16 +43,23 @@ export const VaporTransition: FunctionalComponent<TransitionProps> =
let resolvedProps let resolvedProps
renderEffect(() => { renderEffect(() => {
resolvedProps = resolveTransitionProps(props) resolvedProps = resolveTransitionProps(props)
// only update props for Fragment block, for later reusing
if (isFragment(children) && children.$transition) { if (isFragment(children) && children.$transition) {
children.$transition.props = resolvedProps 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(), state: useTransitionState(),
props: resolvedProps!, props: resolvedProps!,
} as VaporTransitionHooks } as VaporTransitionHooks)
applyTransitionEnterHooks(children, hooks)
return children return children
}) })
@ -122,7 +129,7 @@ export function resolveTransitionHooks(
return hooks return hooks
} }
export function applyTransitionEnterHooks( export function applyTransitionHooks(
block: Block, block: Block,
hooks: VaporTransitionHooks, hooks: VaporTransitionHooks,
): VaporTransitionHooks { ): VaporTransitionHooks {
@ -130,20 +137,20 @@ export function applyTransitionEnterHooks(
if (!child) return hooks if (!child) return hooks
const { props, state, delayedLeave } = hooks const { props, state, delayedLeave } = hooks
let enterHooks = resolveTransitionHooks( let resolvedHooks = resolveTransitionHooks(
child, child,
props, props,
state, state,
currentInstance!, currentInstance!,
hooks => (enterHooks = hooks as VaporTransitionHooks), hooks => (resolvedHooks = hooks as VaporTransitionHooks),
) )
enterHooks.delayedLeave = delayedLeave resolvedHooks.delayedLeave = delayedLeave
setTransitionHooks(child, enterHooks) setTransitionHooks(child, resolvedHooks)
if (isFragment(block)) { if (isFragment(block)) {
// also set transition hooks on fragment for reusing during it's updating // 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( export function applyTransitionLeaveHooks(