Skip to content
This repository was archived by the owner on Jul 19, 2025. It is now read-only.

Commit 220fe24

Browse files
authored
fix(runtime-core): ensure unmount dynamic components in optimized mode (#11171)
close #11168
1 parent 8ae4c29 commit 220fe24

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,32 @@ describe('renderer: optimized mode', () => {
487487
expect(spy).toHaveBeenCalledTimes(1)
488488
})
489489

490+
test('should call onUnmounted hook for dynamic components receiving an existing vnode w/ component children', async () => {
491+
const spy = vi.fn()
492+
const show = ref(1)
493+
const Child = {
494+
setup() {
495+
onUnmounted(spy)
496+
return () => 'child'
497+
},
498+
}
499+
const foo = h('div', null, h(Child))
500+
const app = createApp({
501+
render() {
502+
return show.value
503+
? (openBlock(),
504+
createBlock('div', null, [(openBlock(), createBlock(foo))]))
505+
: createCommentVNode('v-if', true)
506+
},
507+
})
508+
509+
app.mount(root)
510+
show.value = 0
511+
await nextTick()
512+
513+
expect(spy).toHaveBeenCalledTimes(1)
514+
})
515+
490516
// #2444
491517
// `KEYED_FRAGMENT` and `UNKEYED_FRAGMENT` always need to diff its children
492518
test('non-stable Fragment always need to diff its children', () => {

packages/runtime-core/src/renderer.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,6 +2112,11 @@ function baseCreateRenderer(
21122112
dirs,
21132113
memoIndex,
21142114
} = vnode
2115+
2116+
if (patchFlag === PatchFlags.BAIL) {
2117+
optimized = false
2118+
}
2119+
21152120
// unset ref
21162121
if (ref != null) {
21172122
setRef(ref, null, parentSuspense, vnode, true)

0 commit comments

Comments
 (0)