From: daiwei Date: Mon, 29 Sep 2025 00:25:37 +0000 (+0800) Subject: chore: delay insert self anchor during hydration X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0436ceac7784e0738fe97645dc305d792d7f7eac;p=thirdparty%2Fvuejs%2Fcore.git chore: delay insert self anchor during hydration --- diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index 1a5a3d2fdd..34ae218091 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -659,17 +659,6 @@ export function createHydrationFunctions( ) } } - - // the server output does not contain blank text nodes. It appears here that - // it is a dynamically inserted anchor, and needs to be skipped. - // e.g. vaporInteropImpl.mount() > selfAnchor - if ( - node && - node.nodeType === DOMNodeTypes.TEXT && - !(node as Text).data.trim() - ) { - node = nextSibling(node) - } return node } diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts index d007788827..1e88ad00ab 100644 --- a/packages/runtime-vapor/src/vdomInterop.ts +++ b/packages/runtime-vapor/src/vdomInterop.ts @@ -24,6 +24,7 @@ import { isRef, isVNode, onScopeDispose, + queuePostFlushCb, renderSlot, setTransitionHooks as setVNodeTransitionHooks, shallowReactive, @@ -74,7 +75,12 @@ const vaporInteropImpl: Omit< > = { mount(vnode, container, anchor, parentComponent) { let selfAnchor = (vnode.el = vnode.anchor = createTextNode()) - container.insertBefore(selfAnchor, anchor) + if (isHydrating) { + // avoid vdom hydration children mismatch by the selfAnchor, delay its insertion + queuePostFlushCb(() => container.insertBefore(selfAnchor, anchor)) + } else { + container.insertBefore(selfAnchor, anchor) + } const prev = currentInstance simpleSetCurrentInstance(parentComponent)