|
|
@@ -3,7 +3,7 @@ import { patchStyle } from './modules/style'
|
|
|
import { patchAttr } from './modules/attrs'
|
|
|
import { patchDOMProp } from './modules/props'
|
|
|
import { patchEvent } from './modules/events'
|
|
|
-import { isOn, isString } from '@vue/shared'
|
|
|
+import { isOn, isString, isFunction } from '@vue/shared'
|
|
|
import { RendererOptions } from '@vue/runtime-core'
|
|
|
|
|
|
const nativeOnRE = /^on[a-z]/
|
|
|
@@ -34,10 +34,16 @@ export const patchProp: RendererOptions<Node, Element>['patchProp'] = (
|
|
|
patchEvent(el, key, prevValue, nextValue, parentComponent)
|
|
|
}
|
|
|
} else if (
|
|
|
- !isSVG &&
|
|
|
- key in el &&
|
|
|
- // onclick="foo" needs to be set as an attribute to work
|
|
|
- !(nativeOnRE.test(key) && isString(nextValue))
|
|
|
+ isSVG
|
|
|
+ ? // most keys must be set as attribute on svg elements to work
|
|
|
+ // ...except innerHTML
|
|
|
+ key === 'innerHTML' ||
|
|
|
+ // or native onclick with function values
|
|
|
+ (key in el && nativeOnRE.test(key) && isFunction(nextValue))
|
|
|
+ : // 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))
|
|
|
) {
|
|
|
patchDOMProp(
|
|
|
el,
|