diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 0d7df43f6aa..cd0c61982b8 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -1489,5 +1489,20 @@ describe('SSR hydration', () => { mountWithHydration(`
`, () => h('div', { id: 'foo' })) expect(`Hydration attribute mismatch`).toHaveBeenWarnedTimes(2) }) + + test('boolean attr handling', () => { + mountWithHydration(``, () => h('input', { readonly: false })) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + + mountWithHydration(``, () => + h('input', { readonly: true }), + ) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + + mountWithHydration(``, () => + h('input', { readonly: true }), + ) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + }) }) }) diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index e3bd4217287..532fecc8125 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -754,19 +754,18 @@ function propHasMismatch( (el instanceof SVGElement && isKnownSvgAttr(key)) || (el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) ) { - // #10000 some attrs such as textarea.value can't be get by `hasAttribute` - actual = el.hasAttribute(key) - ? el.getAttribute(key) - : key in el - ? el[key as keyof typeof el] - : '' - expected = isBooleanAttr(key) - ? includeBooleanAttr(clientValue) - ? '' - : false - : clientValue == null - ? '' - : String(clientValue) + if (isBooleanAttr(key)) { + actual = el.hasAttribute(key) + expected = includeBooleanAttr(clientValue) + } else { + // #10000 some attrs such as textarea.value can't be get by `hasAttribute` + actual = el.hasAttribute(key) + ? el.getAttribute(key) + : key in el + ? el[key as keyof typeof el] + : '' + expected = clientValue == null ? '' : String(clientValue) + } if (actual !== expected) { mismatchType = `attribute` mismatchKey = key