fix(transition): ensure flattened transition group children inherit parent keys
close #4718 close #5360 close #5392
This commit is contained in:
parent
68bb8f2529
commit
4311dddfa7
@ -164,7 +164,9 @@ const BaseTransitionImpl: ComponentOptions = {
|
|||||||
if (
|
if (
|
||||||
__DEV__ &&
|
__DEV__ &&
|
||||||
mode &&
|
mode &&
|
||||||
mode !== 'in-out' && mode !== 'out-in' && mode !== 'default'
|
mode !== 'in-out' &&
|
||||||
|
mode !== 'out-in' &&
|
||||||
|
mode !== 'default'
|
||||||
) {
|
) {
|
||||||
warn(`invalid <transition> mode: ${mode}`)
|
warn(`invalid <transition> mode: ${mode}`)
|
||||||
}
|
}
|
||||||
@ -460,22 +462,28 @@ export function setTransitionHooks(vnode: VNode, hooks: TransitionHooks) {
|
|||||||
|
|
||||||
export function getTransitionRawChildren(
|
export function getTransitionRawChildren(
|
||||||
children: VNode[],
|
children: VNode[],
|
||||||
keepComment: boolean = false
|
keepComment: boolean = false,
|
||||||
|
parentKey?: VNode['key']
|
||||||
): VNode[] {
|
): VNode[] {
|
||||||
let ret: VNode[] = []
|
let ret: VNode[] = []
|
||||||
let keyedFragmentCount = 0
|
let keyedFragmentCount = 0
|
||||||
for (let i = 0; i < children.length; i++) {
|
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
|
// handle fragment children case, e.g. v-for
|
||||||
if (child.type === Fragment) {
|
if (child.type === Fragment) {
|
||||||
if (child.patchFlag & PatchFlags.KEYED_FRAGMENT) keyedFragmentCount++
|
if (child.patchFlag & PatchFlags.KEYED_FRAGMENT) keyedFragmentCount++
|
||||||
ret = ret.concat(
|
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
|
// comment placeholders should be skipped, e.g. v-if
|
||||||
else if (keepComment || child.type !== Comment) {
|
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
|
// #1126 if a transition children list contains multiple sub fragments, these
|
||||||
|
Loading…
Reference in New Issue
Block a user