This commit is contained in:
edison 2025-06-26 14:38:04 +03:00 committed by GitHub
commit 0a25ace261
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 1 deletions

View File

@ -2379,6 +2379,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>`,

View File

@ -19,6 +19,7 @@ import {
ShapeFlags, ShapeFlags,
def, def,
getEscapedCssVarName, getEscapedCssVarName,
hasOwn,
includeBooleanAttr, includeBooleanAttr,
isBooleanAttr, isBooleanAttr,
isKnownHtmlAttr, isKnownHtmlAttr,
@ -677,7 +678,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) &&
!isMismatchAllowedForCommentNode(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:`,
@ -1000,3 +1004,11 @@ function isMismatchAllowed(
return list.includes(MismatchTypeString[allowedType]) return list.includes(MismatchTypeString[allowedType])
} }
} }
// data-allow-mismatch + v-if
function isMismatchAllowedForCommentNode(
node: Node,
{ props }: VNode,
): boolean {
return isComment(node) && props != null && hasOwn(props, allowMismatchAttr)
}