fix(teleport): handle deferred teleport update before mounted (#12168)

close #12161
This commit is contained in:
edison 2024-11-14 20:55:18 +08:00 committed by GitHub
parent c4312f9c71
commit 8bff142f99
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 65 additions and 1 deletions

View File

@ -87,6 +87,49 @@ describe('renderer: teleport', () => {
`</div>`, `</div>`,
) )
}) })
test('update before mounted with defer', async () => {
const root = document.createElement('div')
document.body.appendChild(root)
const show = ref(false)
const foo = ref('foo')
const Header = {
props: { foo: String },
setup(props: any) {
return () => h('div', props.foo)
},
}
const Footer = {
setup() {
foo.value = 'bar'
return () => h('div', 'Footer')
},
}
createDOMApp({
render() {
return show.value
? [
h(
Teleport,
{ to: '#targetId', defer: true },
h(Header, { foo: foo.value }),
),
h(Footer),
h('div', { id: 'targetId' }),
]
: [h('div')]
},
}).mount(root)
expect(root.innerHTML).toMatchInlineSnapshot(`"<div></div>"`)
show.value = true
await nextTick()
expect(root.innerHTML).toMatchInlineSnapshot(
`"<!--teleport start--><!--teleport end--><div>Footer</div><div id="targetId"><div>bar</div></div>"`,
)
})
}) })
function runSharedTests(deferMode: boolean) { function runSharedTests(deferMode: boolean) {

View File

@ -164,11 +164,32 @@ export const TeleportImpl = {
} }
if (isTeleportDeferred(n2.props)) { if (isTeleportDeferred(n2.props)) {
queuePostRenderEffect(mountToTarget, parentSuspense) queuePostRenderEffect(() => {
mountToTarget()
n2.el!.__isMounted = true
}, parentSuspense)
} else { } else {
mountToTarget() mountToTarget()
} }
} else { } else {
if (isTeleportDeferred(n2.props) && !n1.el!.__isMounted) {
queuePostRenderEffect(() => {
TeleportImpl.process(
n1,
n2,
container,
anchor,
parentComponent,
parentSuspense,
namespace,
slotScopeIds,
optimized,
internals,
)
delete n1.el!.__isMounted
}, parentSuspense)
return
}
// update content // update content
n2.el = n1.el n2.el = n1.el
n2.targetStart = n1.targetStart n2.targetStart = n1.targetStart