Skip to content

Commit d62aff8

Browse files
committed
fix(runtime-core): ensure correct anchor el for deeper unresolved async components
1 parent f51d3e2 commit d62aff8

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

packages/runtime-core/src/renderer.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@ function baseCreateRenderer(
19961996
const anchor =
19971997
nextIndex + 1 < l2
19981998
? // #13559, fallback to el placeholder for unresolved async component
1999-
anchorVNode.el || anchorVNode.placeholder
1999+
anchorVNode.el || resolveAsyncComponentPlaceholder(anchorVNode)
20002000
: parentAnchor
20012001
if (newIndexToOldIndexMap[i] === 0) {
20022002
// mount new
@@ -2577,3 +2577,26 @@ export function invalidateMount(hooks: LifecycleHook): void {
25772577
hooks[i].flags! |= SchedulerJobFlags.DISPOSED
25782578
}
25792579
}
2580+
2581+
function resolveAsyncComponentPlaceholder(anchorVnode: VNode) {
2582+
// anchor vnode is a unresolved async component
2583+
if (anchorVnode.placeholder) {
2584+
return anchorVnode.placeholder
2585+
}
2586+
2587+
// anchor vnode maybe is a wrapper component has single unresolved async component
2588+
const asyncWrapper = anchorVnode.component
2589+
if (asyncWrapper) {
2590+
const subTree = asyncWrapper.subTree
2591+
2592+
// wrapper that directly contains an unresolved async component
2593+
if (subTree.placeholder) {
2594+
return subTree.placeholder
2595+
}
2596+
2597+
// try to locate deeper nested async component placeholder
2598+
return resolveAsyncComponentPlaceholder(subTree)
2599+
}
2600+
2601+
return null
2602+
}

0 commit comments

Comments
 (0)