<!--[-->
<!--[--><span>a</span><!--]-->
<!--[--><span>b</span><!--]-->
- <!--[--><span>c</span><!--for--><!--]-->
- </div>"
+ <!--[--><span>c</span><!--]-->
+ <!--for--></div>"
`,
)
<!--[-->
<!--[--><span>a</span><!--]-->
<!--[--><span>b</span><!--]-->
- <!--[--><span>c</span><span>d</span><!--slot--><!--for--><!--]-->
- </div>"
+ <!--[--><span>c</span><!--]-->
+ <span>d</span><!--slot--><!--for--></div>"
`,
)
})
`,
)
})
+
+ test('on component with non-hydration node', async () => {
+ const data = ref({ show: true, msg: 'foo' })
+ const { container } = await testHydration(
+ `<template>
+ <div>
+ <components.Child v-for="item in 2" :key="item"/>
+ </div>
+ </template>`,
+ {
+ Child: `<template>
+ <div>
+ <div>
+ <div v-if="data.show">{{ data.msg }}</div>
+ </div>
+ <span>non-hydration node</span>
+ </div>
+ </template>`,
+ },
+ data,
+ )
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `
+ "<div>
+ <!--[--><div><div><div>foo</div><!--if--></div><span>non-hydration node</span></div><div><div><div>foo</div><!--if--></div><span>non-hydration node</span></div><!--for--></div>"
+ `,
+ )
+
+ data.value.msg = 'bar'
+ await nextTick()
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(
+ `
+ "<div>
+ <!--[--><div><div><div>bar</div><!--if--></div><span>non-hydration node</span></div><div><div><div>bar</div><!--if--></div><span>non-hydration node</span></div><!--for--></div>"
+ `,
+ )
+
+ data.value.show = false
+ await nextTick()
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(`
+ "<div>
+ <!--[--><div><div><!--if--></div><span>non-hydration node</span></div><div><div><!--if--></div><span>non-hydration node</span></div><!--for--></div>"
+ `)
+
+ data.value.show = true
+ await nextTick()
+ expect(formatHtml(container.innerHTML)).toMatchInlineSnapshot(`
+ "<div>
+ <!--[--><div><div><div>bar</div><!--if--></div><span>non-hydration node</span></div><div><div><div>bar</div><!--if--></div><span>non-hydration node</span></div><!--for--></div>"
+ `)
+ })
})
describe('slots', () => {
isHydrating,
locateFragmentEndAnchor,
locateHydrationNode,
+ setCurrentHydrationNode,
} from './dom/hydration'
-import { ForFragment, VaporFragment } from './fragment'
+import { ForFragment, VaporFragment, findLastChild } from './fragment'
import {
insertionAnchor,
insertionParent,
if (!isMounted) {
isMounted = true
for (let i = 0; i < newLength; i++) {
+ if (isHydrating && isComponent && i > 0) {
+ setCurrentHydrationNode(
+ findLastChild(newBlocks[i - 1].nodes)!.nextSibling,
+ )
+ }
mount(source, i)
}
if (isHydrating) {
+ if (isComponent) {
+ setCurrentHydrationNode(
+ findLastChild(newBlocks[newLength - 1].nodes)!.nextSibling,
+ )
+ }
parentAnchor = locateFragmentEndAnchor()!
if (__DEV__) {
if (!parentAnchor) {
if (node && node instanceof Node) {
return node
} else if (isArray(node)) {
- return normalizeAnchor(node[0])
+ return normalizeAnchor(node[node.length - 1])
} else if (isVaporComponent(node)) {
return normalizeAnchor(node.block!)
} else {