createBlock,
FunctionalComponent,
createCommentVNode,
- Fragment
+ Fragment,
+ withModifiers
} from '@vue/runtime-dom'
import { PatchFlags } from '@vue/shared/src'
expect(`Extraneous non-emits event listeners`).toHaveBeenWarned()
})
+ it('should dedupe same listeners when $attrs is used during render', () => {
+ const click = jest.fn()
+ const count = ref(0)
+
+ function inc() {
+ count.value++
+ click()
+ }
+
+ const Parent = {
+ render() {
+ return h(Child, { onClick: inc })
+ }
+ }
+
+ const Child = defineComponent({
+ render() {
+ return h(
+ 'div',
+ mergeProps(
+ {
+ onClick: withModifiers(() => {}, ['prevent', 'stop'])
+ },
+ this.$attrs
+ )
+ )
+ }
+ })
+
+ const root = document.createElement('div')
+ document.body.appendChild(root)
+ render(h(Parent), root)
+
+ const node = root.children[0] as HTMLElement
+ node.dispatchEvent(new CustomEvent('click'))
+ expect(click).toHaveBeenCalledTimes(1)
+ expect(count.value).toBe(1)
+ })
+
it('should not warn when $attrs is used during render', () => {
const Parent = {
render() {
} else if (isOn(key)) {
const existing = ret[key]
const incoming = toMerge[key]
- if (existing !== incoming) {
+ if (
+ existing !== incoming &&
+ !(isArray(existing) && existing.includes(incoming))
+ ) {
ret[key] = existing
? [].concat(existing as any, incoming as any)
: incoming