From 07b45474b241779a698d22b80be0e303da1a6577 Mon Sep 17 00:00:00 2001 From: edison Date: Tue, 21 Oct 2025 17:11:03 +0800 Subject: [PATCH] chore(runtime-vapor): refactor createKeyedFragment for improved insertion handling (#14005) --- .../runtime-vapor/src/apiCreateFragment.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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 } -- 2.47.3