mirror of https://github.com/vuejs/core.git
fix(hydration): handle v-if node mismatch
This commit is contained in:
parent
22f359bdbe
commit
913af4c543
|
@ -2299,6 +2299,16 @@ describe('SSR hydration', () => {
|
||||||
expect(`Hydration node mismatch`).not.toHaveBeenWarned()
|
expect(`Hydration node mismatch`).not.toHaveBeenWarned()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('comment mismatch (v-if)', () => {
|
||||||
|
const { container } = mountWithHydration(`<!--v-if-->`, () =>
|
||||||
|
h('div', { 'data-allow-mismatch': '' }, [h('span', 'value')]),
|
||||||
|
)
|
||||||
|
expect(container.innerHTML).toBe(
|
||||||
|
'<div data-allow-mismatch=""><span>value</span></div>',
|
||||||
|
)
|
||||||
|
expect(`Hydration node mismatch`).not.toHaveBeenWarned()
|
||||||
|
})
|
||||||
|
|
||||||
test('comment mismatch (text)', () => {
|
test('comment mismatch (text)', () => {
|
||||||
const { container } = mountWithHydration(
|
const { container } = mountWithHydration(
|
||||||
`<div data-allow-mismatch="children">foobar</div>`,
|
`<div data-allow-mismatch="children">foobar</div>`,
|
||||||
|
|
|
@ -675,7 +675,10 @@ export function createHydrationFunctions(
|
||||||
slotScopeIds: string[] | null,
|
slotScopeIds: string[] | null,
|
||||||
isFragment: boolean,
|
isFragment: boolean,
|
||||||
): Node | null => {
|
): Node | null => {
|
||||||
if (!isMismatchAllowed(node.parentElement!, MismatchTypes.CHILDREN)) {
|
if (
|
||||||
|
!isMismatchAllowed(node.parentElement!, MismatchTypes.CHILDREN) &&
|
||||||
|
!isCommentNodeMismatch(node, vnode)
|
||||||
|
) {
|
||||||
;(__DEV__ || __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__) &&
|
;(__DEV__ || __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__) &&
|
||||||
warn(
|
warn(
|
||||||
`Hydration node mismatch:\n- rendered on server:`,
|
`Hydration node mismatch:\n- rendered on server:`,
|
||||||
|
@ -993,3 +996,12 @@ function isMismatchAllowed(
|
||||||
return allowedAttr.split(',').includes(MismatchTypeString[allowedType])
|
return allowedAttr.split(',').includes(MismatchTypeString[allowedType])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// data-allow-mismatch + v-if
|
||||||
|
function isCommentNodeMismatch(node: Node, vnode: VNode): boolean {
|
||||||
|
if (node.nodeType !== DOMNodeTypes.COMMENT || !vnode.props) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return allowMismatchAttr in vnode.props
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue