expect(fn).toHaveBeenCalled()
})
+ // #954
+ test('(svg) innerHTML unmount prev children', () => {
+ const fn = jest.fn()
+ const comp = {
+ render: () => 'foo',
+ unmounted: fn
+ }
+ const root = document.createElement('div')
+ render(h('div', null, [h(comp)]), root)
+ expect(root.innerHTML).toBe(`<div>foo</div>`)
+
+ render(h('svg', { innerHTML: '<g></g>' }), root)
+ expect(root.innerHTML).toBe(`<svg><g></g></svg>`)
+ expect(fn).toHaveBeenCalled()
+ })
+
test('textContent unmount prev children', () => {
const fn = jest.fn()
const comp = {
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]/
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,