From: edison Date: Tue, 21 Oct 2025 09:11:03 +0000 (+0800) Subject: chore(runtime-vapor): refactor createKeyedFragment for improved insertion handling... X-Git-Tag: v3.6.0-alpha.3~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=07b45474b241779a698d22b80be0e303da1a6577;p=thirdparty%2Fvuejs%2Fcore.git chore(runtime-vapor): refactor createKeyedFragment for improved insertion handling (#14005) --- diff --git a/packages/runtime-vapor/src/apiCreateFragment.ts b/packages/runtime-vapor/src/apiCreateFragment.ts index d4bb876368..3e40281a02 100644 --- a/packages/runtime-vapor/src/apiCreateFragment.ts +++ b/packages/runtime-vapor/src/apiCreateFragment.ts @@ -1,11 +1,31 @@ -import type { Block, BlockFn } from './block' +import { type Block, type BlockFn, insert } from './block' +import { advanceHydrationNode, isHydrating } from './dom/hydration' import { DynamicFragment } from './fragment' +import { + insertionAnchor, + insertionParent, + isLastInsertion, + resetInsertionState, +} from './insertionState' import { renderEffect } from './renderEffect' export function createKeyedFragment(key: () => any, render: BlockFn): Block { + const _insertionParent = insertionParent + const _insertionAnchor = insertionAnchor + const _isLastInsertion = isLastInsertion + if (!isHydrating) resetInsertionState() + const frag = __DEV__ ? new DynamicFragment('keyed') : new DynamicFragment() renderEffect(() => { frag.update(render, key()) }) + + if (!isHydrating) { + if (_insertionParent) insert(frag, _insertionParent, _insertionAnchor) + } else { + if (_isLastInsertion) { + advanceHydrationNode(_insertionParent!) + } + } return frag }