h,
nextTick,
onMounted,
+ onServerPrefetch,
openBlock,
reactive,
ref,
)
})
+ test('with data-allow-mismatch component when using onServerPrefetch', async () => {
+ const Comp = {
+ template: `
+ <div>Comp2</div>
+ `,
+ }
+ let foo: any
+ const App = {
+ setup() {
+ const flag = ref(true)
+ foo = () => {
+ flag.value = false
+ }
+ onServerPrefetch(() => (flag.value = false))
+ return { flag }
+ },
+ components: {
+ Comp,
+ },
+ template: `
+ <span data-allow-mismatch>
+ <Comp v-if="flag"></Comp>
+ </span>
+ `,
+ }
+ // hydrate
+ const container = document.createElement('div')
+ container.innerHTML = await renderToString(h(App))
+ createSSRApp(App).mount(container)
+ expect(container.innerHTML).toBe(
+ '<span data-allow-mismatch=""><div>Comp2</div></span>',
+ )
+ foo()
+ await nextTick()
+ expect(container.innerHTML).toBe(
+ '<span data-allow-mismatch=""><!--v-if--></span>',
+ )
+ })
+
test('Teleport unmount (full integration)', async () => {
const Comp1 = {
template: `
import type { TeleportImpl, TeleportVNode } from './components/Teleport'
import { isAsyncWrapper } from './apiAsyncComponent'
import { isReactive } from '@vue/reactivity'
+import { updateHOCHostEl } from './componentRenderUtils'
export type RootHydrateFunction = (
vnode: VNode<Node, Element>,
getContainerType(container),
slotScopeIds,
)
+ // the component vnode's el should be updated when a mismatch occurs.
+ if (parentComponent) {
+ parentComponent.vnode.el = vnode.el
+ updateHOCHostEl(parentComponent, vnode.el)
+ }
return next
}