diff --git a/packages/runtime-dom/src/patchProp.ts b/packages/runtime-dom/src/patchProp.ts index 979f9f2427d..4aa8c010c08 100644 --- a/packages/runtime-dom/src/patchProp.ts +++ b/packages/runtime-dom/src/patchProp.ts @@ -34,7 +34,15 @@ export const patchProp: RendererOptions['patchProp'] = ( patchEvent(el, key, prevValue, nextValue, parentComponent) } } else if ( - isSVG + // spellcheck and draggable are numerated attrs, however their + // corresponding DOM properties are actually booleans - this leads to + // setting it with a string "false" value leading it to be coerced to + // `true`, so we need to always treat them as attributes. + // Note that `contentEditable` doesn't have this problem: its DOM + // property is also enumerated string values. + key !== 'spellcheck' && + key !== 'draggable' && + (isSVG ? // most keys must be set as attribute on svg elements to work // ...except innerHTML key === 'innerHTML' || @@ -43,7 +51,7 @@ export const patchProp: RendererOptions['patchProp'] = ( : // for normal html elements, set as a property if it exists key in el && // except native onclick with string values - !(nativeOnRE.test(key) && isString(nextValue)) + !(nativeOnRE.test(key) && isString(nextValue))) ) { patchDOMProp( el,