mirror of https://github.com/vuejs/core.git
fix(teleport): handle deferred teleport update before mounted (#12168)
close #12161
This commit is contained in:
parent
c4312f9c71
commit
8bff142f99
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue