fix(runtime-core): transition hooks can be arrays of functions (#5177)
This commit is contained in:
		
							parent
							
								
									da10dd7de9
								
							
						
					
					
						commit
						fec12d7dcc
					
				| @ -16,10 +16,12 @@ import { warn } from '../warning' | ||||
| import { isKeepAlive } from './KeepAlive' | ||||
| import { toRaw } from '@vue/reactivity' | ||||
| import { callWithAsyncErrorHandling, ErrorCodes } from '../errorHandling' | ||||
| import { ShapeFlags, PatchFlags } from '@vue/shared' | ||||
| import { ShapeFlags, PatchFlags, isArray } from '@vue/shared' | ||||
| import { onBeforeUnmount, onMounted } from '../apiLifecycle' | ||||
| import { RendererElement } from '../renderer' | ||||
| 
 | ||||
| type Hook<T = () => void> = T | T[] | ||||
| 
 | ||||
| export interface BaseTransitionProps<HostElement = RendererElement> { | ||||
|   mode?: 'in-out' | 'out-in' | 'default' | ||||
|   appear?: boolean | ||||
| @ -34,20 +36,20 @@ export interface BaseTransitionProps<HostElement = RendererElement> { | ||||
|   // Hooks. Using camel case for easier usage in render functions & JSX.
 | ||||
|   // In templates these can be written as @before-enter="xxx" as prop names
 | ||||
|   // are camelized.
 | ||||
|   onBeforeEnter?: (el: HostElement) => void | ||||
|   onEnter?: (el: HostElement, done: () => void) => void | ||||
|   onAfterEnter?: (el: HostElement) => void | ||||
|   onEnterCancelled?: (el: HostElement) => void | ||||
|   onBeforeEnter?: Hook<(el: HostElement) => void> | ||||
|   onEnter?: Hook<(el: HostElement, done: () => void) => void> | ||||
|   onAfterEnter?: Hook<(el: HostElement) => void> | ||||
|   onEnterCancelled?: Hook<(el: HostElement) => void> | ||||
|   // leave
 | ||||
|   onBeforeLeave?: (el: HostElement) => void | ||||
|   onLeave?: (el: HostElement, done: () => void) => void | ||||
|   onAfterLeave?: (el: HostElement) => void | ||||
|   onLeaveCancelled?: (el: HostElement) => void // only fired in persisted mode
 | ||||
|   onBeforeLeave?: Hook<(el: HostElement) => void> | ||||
|   onLeave?: Hook<(el: HostElement, done: () => void) => void> | ||||
|   onAfterLeave?: Hook<(el: HostElement) => void> | ||||
|   onLeaveCancelled?: Hook<(el: HostElement) => void> // only fired in persisted mode
 | ||||
|   // appear
 | ||||
|   onBeforeAppear?: (el: HostElement) => void | ||||
|   onAppear?: (el: HostElement, done: () => void) => void | ||||
|   onAfterAppear?: (el: HostElement) => void | ||||
|   onAppearCancelled?: (el: HostElement) => void | ||||
|   onBeforeAppear?: Hook<(el: HostElement) => void> | ||||
|   onAppear?: Hook<(el: HostElement, done: () => void) => void> | ||||
|   onAfterAppear?: Hook<(el: HostElement) => void> | ||||
|   onAppearCancelled?: Hook<(el: HostElement) => void> | ||||
| } | ||||
| 
 | ||||
| export interface TransitionHooks< | ||||
| @ -69,9 +71,9 @@ export interface TransitionHooks< | ||||
|   delayedLeave?(): void | ||||
| } | ||||
| 
 | ||||
| export type TransitionHookCaller = ( | ||||
|   hook: ((el: any) => void) | Array<(el: any) => void> | undefined, | ||||
|   args?: any[] | ||||
| export type TransitionHookCaller = <T extends any[] = [el: any]>( | ||||
|   hook: Hook<(...args: T) => void> | undefined, | ||||
|   args?: T | ||||
| ) => void | ||||
| 
 | ||||
| export type PendingCallback = (cancelled?: boolean) => void | ||||
| @ -331,6 +333,19 @@ export function resolveTransitionHooks( | ||||
|       ) | ||||
|   } | ||||
| 
 | ||||
|   const callAsyncHook = ( | ||||
|     hook: Hook<(el: any, done: () => void) => void>, | ||||
|     args: [TransitionElement, () => void] | ||||
|   ) => { | ||||
|     const done = args[1] | ||||
|     callHook(hook, args) | ||||
|     if (isArray(hook)) { | ||||
|       if (hook.every(hook => hook.length <= 1)) done() | ||||
|     } else if (hook.length <= 1) { | ||||
|       done() | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   const hooks: TransitionHooks<TransitionElement> = { | ||||
|     mode, | ||||
|     persisted, | ||||
| @ -388,10 +403,7 @@ export function resolveTransitionHooks( | ||||
|         el._enterCb = undefined | ||||
|       }) | ||||
|       if (hook) { | ||||
|         hook(el, done) | ||||
|         if (hook.length <= 1) { | ||||
|           done() | ||||
|         } | ||||
|         callAsyncHook(hook, [el, done]) | ||||
|       } else { | ||||
|         done() | ||||
|       } | ||||
| @ -423,10 +435,7 @@ export function resolveTransitionHooks( | ||||
|       }) | ||||
|       leavingVNodesCache[key] = vnode | ||||
|       if (onLeave) { | ||||
|         onLeave(el, done) | ||||
|         if (onLeave.length <= 1) { | ||||
|           done() | ||||
|         } | ||||
|         callAsyncHook(onLeave, [el, done]) | ||||
|       } else { | ||||
|         done() | ||||
|       } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user