render(null, root)
expect(spy).toHaveBeenCalledTimes(1)
})
+
+ // #2444
+ // `KEYED_FRAGMENT` and `UNKEYED_FRAGMENT` always need to diff its children
+ test('non-stable Fragment always need to diff its children', () => {
+ const spyA = jest.fn()
+ const spyB = jest.fn()
+ const ChildA = {
+ setup() {
+ onBeforeUnmount(spyA)
+ return () => 'child'
+ }
+ }
+ const ChildB = {
+ setup() {
+ onBeforeUnmount(spyB)
+ return () => 'child'
+ }
+ }
+ const Parent = () => (
+ openBlock(),
+ createBlock('div', null, [
+ (openBlock(true),
+ createBlock(
+ Fragment,
+ null,
+ [createVNode(ChildA, { key: 0 })],
+ 128 /* KEYED_FRAGMENT */
+ )),
+ (openBlock(true),
+ createBlock(
+ Fragment,
+ null,
+ [createVNode(ChildB)],
+ 256 /* UNKEYED_FRAGMENT */
+ ))
+ ])
+ )
+ render(h(Parent), root)
+ render(null, root)
+ expect(spyA).toHaveBeenCalledTimes(1)
+ expect(spyB).toHaveBeenCalledTimes(1)
+ })
})
false,
true
)
- } else if (!optimized && shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
+ } else if (
+ (type === Fragment &&
+ (patchFlag & PatchFlags.KEYED_FRAGMENT ||
+ patchFlag & PatchFlags.UNKEYED_FRAGMENT)) ||
+ (!optimized && shapeFlag & ShapeFlags.ARRAY_CHILDREN)
+ ) {
unmountChildren(children as VNode[], parentComponent, parentSuspense)
}