diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 3b2bdbf35c0..c379485d6aa 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -1512,6 +1512,16 @@ describe('SSR hydration', () => { expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() }) + test('client value is null or undefined', () => { + mountWithHydration(`
`, () => + h('div', { draggable: undefined }), + ) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + + mountWithHydration(``, () => h('input', { type: null })) + expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() + }) + test('should not warn against object values', () => { mountWithHydration(``, () => h('input', { from: {} })) expect(`Hydration attribute mismatch`).not.toHaveBeenWarned() diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index 8ac4fbb75f7..4970aee62bd 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -758,6 +758,9 @@ function propHasMismatch( if (isBooleanAttr(key)) { actual = el.hasAttribute(key) expected = includeBooleanAttr(clientValue) + } else if (clientValue == null) { + actual = el.hasAttribute(key) + expected = false } else { if (el.hasAttribute(key)) { actual = el.getAttribute(key)