diff --git a/packages/runtime-dom/__tests__/patchProps.spec.ts b/packages/runtime-dom/__tests__/patchProps.spec.ts index 962d55e882b..bec0f9ba342 100644 --- a/packages/runtime-dom/__tests__/patchProps.spec.ts +++ b/packages/runtime-dom/__tests__/patchProps.spec.ts @@ -149,4 +149,11 @@ describe('runtime-dom: props patching', () => { patchProp(el, 'form', 'foo', null) expect(el.getAttribute('form')).toBe(null) }) + + test('readonly type prop on textarea', () => { + const el = document.createElement('textarea') + // just to verify that it doesn't throw when i.e. switching a dynamic :is from an 'input' to a 'textarea' + // see https://github.com/vuejs/vue-next/issues/2766 + patchProp(el, 'type', 'text', null) + }) }) diff --git a/packages/runtime-dom/src/patchProp.ts b/packages/runtime-dom/src/patchProp.ts index 848ee160a8b..6842b98c2b0 100644 --- a/packages/runtime-dom/src/patchProp.ts +++ b/packages/runtime-dom/src/patchProp.ts @@ -115,5 +115,10 @@ function shouldSetAsProp( return false } + // DOMprop "type" is readonly on textarea elements: https://github.com/vuejs/vue-next/issues/2766 + if (key === 'type' && el.tagName === 'TEXTAREA') { + return false + } + return key in el }