From: daiwei Date: Thu, 22 May 2025 03:17:17 +0000 (+0800) Subject: chore: track KeepAlive child as block inside v-for X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F12915%2Fhead;p=thirdparty%2Fvuejs%2Fcore.git chore: track KeepAlive child as block inside v-for --- diff --git a/packages/compiler-core/src/transforms/vFor.ts b/packages/compiler-core/src/transforms/vFor.ts index 0dca0ba9ab..8aba1f2c1b 100644 --- a/packages/compiler-core/src/transforms/vFor.ts +++ b/packages/compiler-core/src/transforms/vFor.ts @@ -42,6 +42,7 @@ import { import { FRAGMENT, IS_MEMO_SAME, + KEEP_ALIVE, OPEN_BLOCK, RENDER_LIST, } from '../runtimeHelpers' @@ -208,7 +209,9 @@ export const transformFor: NodeTransform = createStructuralDirectiveTransform( ) } } - childBlock.isBlock = !isStableFragment + // track KeepAlive child as block + childBlock.isBlock = + childBlock.tag === KEEP_ALIVE || !isStableFragment if (childBlock.isBlock) { helper(OPEN_BLOCK) helper(getVNodeBlockHelper(context.inSSR, childBlock.isComponent)) diff --git a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts index 7587ecfcba..f6fd16692c 100644 --- a/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts +++ b/packages/runtime-core/__tests__/rendererOptimizedMode.spec.ts @@ -1431,11 +1431,14 @@ describe('renderer: optimized mode', () => { Fragment, null, renderList(1, () => { - return createVNode( - KeepAlive, - null, - [(openBlock(), createBlock(view.value))], - 1024 /* DYNAMIC_SLOTS */, + return ( + openBlock(), + createBlock( + KeepAlive, + { include: [] }, + [(openBlock(), createBlock(view.value))], + 1024 /* DYNAMIC_SLOTS */, + ) ) }), 64 /* STABLE_FRAGMENT */, diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 23c0f447d1..7b39aa917a 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -2110,7 +2110,7 @@ function baseCreateRenderer( } if (shapeFlag & ShapeFlags.COMPONENT_SHOULD_KEEP_ALIVE) { - ;(vnode.component!.parent!.ctx as KeepAliveContext).deactivate(vnode) + ;(parentComponent!.ctx as KeepAliveContext).deactivate(vnode) return }