fix(BaseTransition): collect correct children with slot passthrough in Transition (#1456)
				
					
				
			fix #1455
This commit is contained in:
		
							parent
							
								
									afe13e0584
								
							
						
					
					
						commit
						d4cd12887e
					
				@ -8,7 +8,8 @@ import {
 | 
			
		||||
  Comment,
 | 
			
		||||
  isSameVNodeType,
 | 
			
		||||
  VNode,
 | 
			
		||||
  VNodeArrayChildren
 | 
			
		||||
  VNodeArrayChildren,
 | 
			
		||||
  Fragment
 | 
			
		||||
} from '../vnode'
 | 
			
		||||
import { warn } from '../warning'
 | 
			
		||||
import { isKeepAlive } from './KeepAlive'
 | 
			
		||||
@ -135,7 +136,10 @@ const BaseTransitionImpl = {
 | 
			
		||||
    const state = useTransitionState()
 | 
			
		||||
 | 
			
		||||
    return () => {
 | 
			
		||||
      const children = slots.default && slots.default()
 | 
			
		||||
      const children = getTransitionRawChildren(
 | 
			
		||||
        slots.default ? slots.default() : [],
 | 
			
		||||
        true
 | 
			
		||||
      )
 | 
			
		||||
      if (!children || !children.length) {
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
@ -417,3 +421,27 @@ export function setTransitionHooks(vnode: VNode, hooks: TransitionHooks) {
 | 
			
		||||
    vnode.transition = hooks
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function getTransitionRawChildren(
 | 
			
		||||
  children: VNode[],
 | 
			
		||||
  keepComment: boolean = false
 | 
			
		||||
): VNode[] {
 | 
			
		||||
  let ret: VNode[] = []
 | 
			
		||||
  for (let i = 0; i < children.length; i++) {
 | 
			
		||||
    const child = children[i]
 | 
			
		||||
    // handle fragment children case, e.g. v-for
 | 
			
		||||
    if (child.type === Fragment) {
 | 
			
		||||
      ret = ret.concat(
 | 
			
		||||
        getTransitionRawChildren(child.children as VNode[], keepComment)
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
    // comment placeholders should be skipped, e.g. v-if
 | 
			
		||||
    else if (
 | 
			
		||||
      child.type !== Comment ||
 | 
			
		||||
      (child.type === Comment && keepComment)
 | 
			
		||||
    ) {
 | 
			
		||||
      ret.push(child)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -91,7 +91,8 @@ export { registerRuntimeCompiler } from './component'
 | 
			
		||||
export {
 | 
			
		||||
  useTransitionState,
 | 
			
		||||
  resolveTransitionHooks,
 | 
			
		||||
  setTransitionHooks
 | 
			
		||||
  setTransitionHooks,
 | 
			
		||||
  getTransitionRawChildren
 | 
			
		||||
} from './components/BaseTransition'
 | 
			
		||||
 | 
			
		||||
// Types -----------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
@ -9,11 +9,11 @@ import {
 | 
			
		||||
} from './Transition'
 | 
			
		||||
import {
 | 
			
		||||
  Fragment,
 | 
			
		||||
  Comment,
 | 
			
		||||
  VNode,
 | 
			
		||||
  warn,
 | 
			
		||||
  resolveTransitionHooks,
 | 
			
		||||
  useTransitionState,
 | 
			
		||||
  getTransitionRawChildren,
 | 
			
		||||
  getCurrentInstance,
 | 
			
		||||
  setTransitionHooks,
 | 
			
		||||
  createVNode,
 | 
			
		||||
@ -129,22 +129,6 @@ const TransitionGroupImpl = {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getTransitionRawChildren(children: VNode[]): VNode[] {
 | 
			
		||||
  let ret: VNode[] = []
 | 
			
		||||
  for (let i = 0; i < children.length; i++) {
 | 
			
		||||
    const child = children[i]
 | 
			
		||||
    // handle fragment children case, e.g. v-for
 | 
			
		||||
    if (child.type === Fragment) {
 | 
			
		||||
      ret = ret.concat(getTransitionRawChildren(child.children as VNode[]))
 | 
			
		||||
    }
 | 
			
		||||
    // comment placeholders should be skipped, e.g. v-if
 | 
			
		||||
    else if (child.type !== Comment) {
 | 
			
		||||
      ret.push(child)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// remove mode props as TransitionGroup doesn't support it
 | 
			
		||||
delete TransitionGroupImpl.props.mode
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user