From: Tycho Date: Sat, 22 Jun 2024 08:54:56 +0000 (+0800) Subject: fix(runtime-core): ensure unmount dynamic components in optimized mode (#11171) X-Git-Tag: v3.4.30~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=220fe247484209e62c7f4991902c5335e29c5007;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): ensure unmount dynamic components in optimized mode (#11171) close #11168 --- diff --git a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts index ef5bdbe013..556ab75209 100644 --- a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts +++ b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts @@ -487,6 +487,32 @@ describe('renderer: optimized mode', () => { expect(spy).toHaveBeenCalledTimes(1) }) + test('should call onUnmounted hook for dynamic components receiving an existing vnode w/ component children', async () => { + const spy = vi.fn() + const show = ref(1) + const Child = { + setup() { + onUnmounted(spy) + return () => 'child' + }, + } + const foo = h('div', null, h(Child)) + const app = createApp({ + render() { + return show.value + ? (openBlock(), + createBlock('div', null, [(openBlock(), createBlock(foo))])) + : createCommentVNode('v-if', true) + }, + }) + + app.mount(root) + show.value = 0 + await nextTick() + + 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', () => { diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index ccb89085c4..66e6965505 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2112,6 +2112,11 @@ function baseCreateRenderer( dirs, memoIndex, } = vnode + + if (patchFlag === PatchFlags.BAIL) { + optimized = false + } + // unset ref if (ref != null) { setRef(ref, null, parentSuspense, vnode, true)