diff --git a/packages/runtime-dom/src/modules/attrs.ts b/packages/runtime-dom/src/modules/attrs.ts index d7188aa9a..1e75e5343 100644 --- a/packages/runtime-dom/src/modules/attrs.ts +++ b/packages/runtime-dom/src/modules/attrs.ts @@ -59,11 +59,11 @@ export function compatCoerceAttr( ): boolean { if (isEnumeratedAttr(key)) { const v2CoercedValue = - value === null - ? 'false' - : typeof value !== 'boolean' && value !== undefined - ? 'true' - : null + value === undefined + ? null + : value === null || value === false || value === 'false' + ? 'false' + : 'true' if ( v2CoercedValue && compatUtils.softAssertCompatEnabled( diff --git a/packages/vue-compat/__tests__/misc.spec.ts b/packages/vue-compat/__tests__/misc.spec.ts index 17fddd94c..dba146fcb 100644 --- a/packages/vue-compat/__tests__/misc.spec.ts +++ b/packages/vue-compat/__tests__/misc.spec.ts @@ -275,3 +275,17 @@ test('ATTR_ENUMERATED_COERCION', () => { )('contenteditable', 'foo', 'true'), ).toHaveBeenWarned() }) + +test('ATTR_ENUMERATED_COERCION: true', () => { + const vm = new Vue({ + compatConfig: { ATTR_ENUMERATED_COERCION: true }, + template: `
hello
`, + }).$mount() + expect(vm.$el.innerHTML).toBe(`
hello
`) + expect( + ( + deprecationData[DeprecationTypes.ATTR_ENUMERATED_COERCION] + .message as Function + )('draggable', 'false', 'false'), + ).toHaveBeenWarned() +})