From 50795f7ae0b59990e855f2f2b728ce1d2c06abd8 Mon Sep 17 00:00:00 2001 From: daiwei Date: Thu, 17 Apr 2025 15:51:03 +0800 Subject: [PATCH] fix(compat): ensure false value on input retains value attribute --- packages/runtime-dom/src/modules/attrs.ts | 1 + packages/vue-compat/__tests__/misc.spec.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/runtime-dom/src/modules/attrs.ts b/packages/runtime-dom/src/modules/attrs.ts index 95e0a14854a..d7188aa9a1f 100644 --- a/packages/runtime-dom/src/modules/attrs.ts +++ b/packages/runtime-dom/src/modules/attrs.ts @@ -79,6 +79,7 @@ export function compatCoerceAttr( } } else if ( value === false && + !(el.tagName === 'INPUT' && key === 'value') && !isSpecialBooleanAttr(key) && compatUtils.isCompatEnabled(DeprecationTypes.ATTR_FALSE_VALUE, instance) ) { diff --git a/packages/vue-compat/__tests__/misc.spec.ts b/packages/vue-compat/__tests__/misc.spec.ts index 1a873633b85..17fddd94c4a 100644 --- a/packages/vue-compat/__tests__/misc.spec.ts +++ b/packages/vue-compat/__tests__/misc.spec.ts @@ -208,6 +208,20 @@ test('ATTR_FALSE_VALUE', () => { ).toHaveBeenWarned() }) +test('ATTR_FALSE_VALUE with false on input value', () => { + const vm = new Vue({ + template: ``, + }).$mount() + expect(vm.$el).toBeInstanceOf(HTMLInputElement) + expect(vm.$el.hasAttribute('value')).toBe(true) + expect(vm.$el.getAttribute('value')).toBe('false') + expect( + (deprecationData[DeprecationTypes.ATTR_FALSE_VALUE].message as Function)( + 'value', + ), + ).not.toHaveBeenWarned() +}) + test("ATTR_FALSE_VALUE with false value shouldn't throw warning", () => { const vm = new Vue({ template: `
`,