fix(runtime-core): should not take unmount children fast path for v-for fragments

fix #1153
This commit is contained in:
Evan You 2020-05-11 13:53:15 -04:00
parent 697de07e63
commit 5b8883a846

View File

@ -1725,7 +1725,16 @@ function baseCreateRenderer(
parentSuspense, parentSuspense,
doRemove = false doRemove = false
) => { ) => {
const { props, ref, children, dynamicChildren, shapeFlag, dirs } = vnode const {
type,
props,
ref,
children,
dynamicChildren,
shapeFlag,
patchFlag,
dirs
} = vnode
const shouldInvokeDirs = shapeFlag & ShapeFlags.ELEMENT && dirs const shouldInvokeDirs = shapeFlag & ShapeFlags.ELEMENT && dirs
const shouldKeepAlive = shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE const shouldKeepAlive = shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE
let vnodeHook: VNodeHook | undefined | null let vnodeHook: VNodeHook | undefined | null
@ -1755,7 +1764,12 @@ function baseCreateRenderer(
invokeDirectiveHook(vnode, null, parentComponent, 'beforeUnmount') invokeDirectiveHook(vnode, null, parentComponent, 'beforeUnmount')
} }
if (dynamicChildren) { if (
dynamicChildren &&
// #1153: fast path should not be taken for non-stable (v-for) fragments
(type !== Fragment ||
(patchFlag > 0 && patchFlag & PatchFlags.STABLE_FRAGMENT))
) {
// fast path for block nodes: only need to unmount dynamic children. // fast path for block nodes: only need to unmount dynamic children.
unmountChildren(dynamicChildren, parentComponent, parentSuspense) unmountChildren(dynamicChildren, parentComponent, parentSuspense)
} else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) { } else if (shapeFlag & ShapeFlags.ARRAY_CHILDREN) {