if (
__DEV__ &&
mode &&
- mode !== 'in-out' && mode !== 'out-in' && mode !== 'default'
+ mode !== 'in-out' &&
+ mode !== 'out-in' &&
+ mode !== 'default'
) {
warn(`invalid <transition> mode: ${mode}`)
}
export function getTransitionRawChildren(
children: VNode[],
- keepComment: boolean = false
+ keepComment: boolean = false,
+ parentKey?: VNode['key']
): VNode[] {
let ret: VNode[] = []
let keyedFragmentCount = 0
for (let i = 0; i < children.length; i++) {
- const child = children[i]
+ let child = children[i]
+ // #5360 inherit parent key in case of <template v-for>
+ const key =
+ parentKey == null
+ ? child.key
+ : String(parentKey) + String(child.key != null ? child.key : i)
// handle fragment children case, e.g. v-for
if (child.type === Fragment) {
if (child.patchFlag & PatchFlags.KEYED_FRAGMENT) keyedFragmentCount++
ret = ret.concat(
- getTransitionRawChildren(child.children as VNode[], keepComment)
+ getTransitionRawChildren(child.children as VNode[], keepComment, key)
)
}
// comment placeholders should be skipped, e.g. v-if
else if (keepComment || child.type !== Comment) {
- ret.push(child)
+ ret.push(key != null ? cloneVNode(child, { key }) : child)
}
}
// #1126 if a transition children list contains multiple sub fragments, these