From: Evan You Date: Wed, 13 Dec 2023 09:56:58 +0000 (+0800) Subject: fix(Suspense): properly fix #6416 X-Git-Tag: v3.4.0-beta.1~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0db336ff6c640fb9d3e48943c69f4c1737412be4;p=thirdparty%2Fvuejs%2Fcore.git fix(Suspense): properly fix #6416 previous fix caused regressions in nuxt --- diff --git a/packages/runtime-core/__tests__/components/Suspense.spec.ts b/packages/runtime-core/__tests__/components/Suspense.spec.ts index 60dcedc970..92638cc6ba 100644 --- a/packages/runtime-core/__tests__/components/Suspense.spec.ts +++ b/packages/runtime-core/__tests__/components/Suspense.spec.ts @@ -1684,7 +1684,9 @@ describe('Suspense', () => { expect(serializeInner(root)).toBe('
async
') viewRef.value = 1 - await nextTick() //TypeError: Cannot read properties of null (reading 'parentNode'),This has been fixed + await nextTick() + // TypeError: Cannot read properties of null (reading 'parentNode') + // This has been fixed expect(serializeInner(root)).toBe(`
sync
`) }) diff --git a/packages/runtime-core/src/componentRenderUtils.ts b/packages/runtime-core/src/componentRenderUtils.ts index 2ed64f7b57..38a9e8d19d 100644 --- a/packages/runtime-core/src/componentRenderUtils.ts +++ b/packages/runtime-core/src/componentRenderUtils.ts @@ -428,8 +428,16 @@ export function updateHOCHostEl( { vnode, parent }: ComponentInternalInstance, el: typeof vnode.el // HostNode ) { - while (parent && parent.subTree === vnode) { - ;(vnode = parent.vnode).el = el - parent = parent.parent + while (parent) { + const root = parent.subTree + if (root.suspense && root.suspense.activeBranch === vnode) { + root.el = vnode.el + } + if (root === vnode) { + ;(vnode = parent.vnode).el = el + parent = parent.parent + } else { + break + } } } diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index b0eb1844ed..d79be152f2 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1241,10 +1241,6 @@ function baseCreateRenderer( if (!initialVNode.el) { const placeholder = (instance.subTree = createVNode(Comment)) processCommentNode(null, placeholder, container!, anchor) - // This noramlly gets setup by the following `setupRenderEffect`. - // But the call is skipped in initial mounting of async element. - // Thus, manually patching is required here or it will result in a crash during parent component update. - initialVNode.el = placeholder.el } return }