@@ -11,6 +11,7 @@ import {
1111 checkTransitionMode ,
1212 currentInstance ,
1313 getComponentName ,
14+ isAsyncWrapper ,
1415 isTemplateNode ,
1516 leaveCbKey ,
1617 queuePostFlushCb ,
@@ -92,7 +93,7 @@ export const VaporTransition: FunctionalVaporComponent = /*@__PURE__*/ decorate(
9293 if ( child ) {
9394 // replace existing transition hooks
9495 child . $transition ! . props = resolvedProps
95- applyTransitionHooks ( child , child . $transition ! )
96+ applyTransitionHooks ( child , child . $transition ! , undefined , true )
9697 }
9798 }
9899 } else {
@@ -141,7 +142,7 @@ export const VaporTransition: FunctionalVaporComponent = /*@__PURE__*/ decorate(
141142)
142143
143144const getTransitionHooksContext = (
144- key : String ,
145+ key : string ,
145146 props : TransitionProps ,
146147 state : TransitionState ,
147148 instance : GenericComponentInstance ,
@@ -210,6 +211,7 @@ export function applyTransitionHooks(
210211 block : Block ,
211212 hooks : VaporTransitionHooks ,
212213 fallthroughAttrs : boolean = true ,
214+ isResolved : boolean = false ,
213215) : VaporTransitionHooks {
214216 // filter out comment nodes
215217 if ( isArray ( block ) ) {
@@ -222,7 +224,9 @@ export function applyTransitionHooks(
222224 }
223225
224226 const isFrag = isFragment ( block )
225- const child = findTransitionBlock ( block , isFrag )
227+ const child = isResolved
228+ ? ( block as TransitionBlock )
229+ : findTransitionBlock ( block , isFrag )
226230 if ( ! child ) {
227231 // set transition hooks on fragment for reusing during it's updating
228232 if ( isFrag ) setTransitionHooksOnFragment ( block , hooks )
@@ -238,7 +242,7 @@ export function applyTransitionHooks(
238242 hooks => ( resolvedHooks = hooks as VaporTransitionHooks ) ,
239243 )
240244 resolvedHooks . delayedLeave = delayedLeave
241- setTransitionHooks ( child , resolvedHooks )
245+ child . $transition = resolvedHooks
242246 if ( isFrag ) setTransitionHooksOnFragment ( block , resolvedHooks )
243247
244248 // fallthrough attrs
@@ -266,7 +270,7 @@ export function applyTransitionLeaveHooks(
266270 state ,
267271 instance ,
268272 )
269- setTransitionHooks ( leavingBlock , leavingHooks )
273+ leavingBlock . $transition = leavingHooks
270274
271275 const { mode } = props
272276 if ( mode === 'out-in' ) {
@@ -300,25 +304,25 @@ export function applyTransitionLeaveHooks(
300304 }
301305}
302306
303- const transitionBlockCache = new WeakMap < Block , TransitionBlock > ( )
304307export function findTransitionBlock (
305308 block : Block ,
306309 inFragment : boolean = false ,
307310) : TransitionBlock | undefined {
308- if ( transitionBlockCache . has ( block ) ) {
309- return transitionBlockCache . get ( block )
310- }
311-
312311 let child : TransitionBlock | undefined
313312 if ( block instanceof Node ) {
314313 // transition can only be applied on Element child
315314 if ( block instanceof Element ) child = block
316315 } else if ( isVaporComponent ( block ) ) {
317- // stop searching if encountering nested Transition component
318- if ( getComponentName ( block . type ) === displayName ) return undefined
319- child = findTransitionBlock ( block . block , inFragment )
320- // use component id as key
321- if ( child && child . $key === undefined ) child . $key = block . uid
316+ // should save hooks on unresolved async wrapper, so that it can be applied after resolved
317+ if ( isAsyncWrapper ( block ) && ! block . type . __asyncResolved ) {
318+ child = block
319+ } else {
320+ // stop searching if encountering nested Transition component
321+ if ( getComponentName ( block . type ) === displayName ) return undefined
322+ child = findTransitionBlock ( block . block , inFragment )
323+ // use component id as key
324+ if ( child && child . $key === undefined ) child . $key = block . uid
325+ }
322326 } else if ( isArray ( block ) ) {
323327 let hasFound = false
324328 for ( const c of block ) {
@@ -369,7 +373,7 @@ export function setTransitionHooksOnFragment(
369373}
370374
371375export function setTransitionHooks (
372- block : TransitionBlock | VaporComponentInstance ,
376+ block : TransitionBlock ,
373377 hooks : VaporTransitionHooks ,
374378) : void {
375379 if ( isVaporComponent ( block ) ) {
0 commit comments