Skip to content

Commit a6e4966

Browse files
authored
fix(runtime-vapor): dynamic component fallback rendering with insertion state (#13492)
1 parent cb92511 commit a6e4966

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

packages/runtime-vapor/__tests__/apiCreateDynamicComponent.spec.ts

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
import { shallowRef } from '@vue/reactivity'
2-
import { nextTick } from '@vue/runtime-dom'
3-
import { createDynamicComponent } from '../src'
1+
import { ref, shallowRef } from '@vue/reactivity'
2+
import { nextTick, resolveDynamicComponent } from '@vue/runtime-dom'
3+
import {
4+
createComponentWithFallback,
5+
createDynamicComponent,
6+
renderEffect,
7+
setHtml,
8+
setInsertionState,
9+
template,
10+
} from '../src'
411
import { makeRender } from './_utils'
512

613
const define = makeRender()
@@ -54,4 +61,22 @@ describe('api: createDynamicComponent', () => {
5461
await nextTick()
5562
expect(html()).toBe('<baz></baz><!--dynamic-component-->')
5663
})
64+
65+
test('render fallback with insertionState', async () => {
66+
const { html, mount } = define({
67+
setup() {
68+
const html = ref('hi')
69+
const n1 = template('<div></div>', true)() as any
70+
setInsertionState(n1)
71+
const n0 = createComponentWithFallback(
72+
resolveDynamicComponent('button') as any,
73+
) as any
74+
renderEffect(() => setHtml(n0, html.value))
75+
return n1
76+
},
77+
}).create()
78+
79+
mount()
80+
expect(html()).toBe('<div><button>hi</button></div>')
81+
})
5782
})

packages/runtime-vapor/src/component.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,14 @@ export function createComponentWithFallback(
476476
return createComponent(comp, rawProps, rawSlots, isSingleRoot)
477477
}
478478

479+
const _insertionParent = insertionParent
480+
const _insertionAnchor = insertionAnchor
481+
if (isHydrating) {
482+
locateHydrationNode()
483+
} else {
484+
resetInsertionState()
485+
}
486+
479487
const el = document.createElement(comp)
480488
// mark single root
481489
;(el as any).$root = isSingleRoot
@@ -494,6 +502,10 @@ export function createComponentWithFallback(
494502
}
495503
}
496504

505+
if (!isHydrating && _insertionParent) {
506+
insert(el, _insertionParent, _insertionAnchor)
507+
}
508+
497509
return el
498510
}
499511

0 commit comments

Comments
 (0)