|
|
@@ -11,7 +11,8 @@ import {
|
|
|
createBlock,
|
|
|
FunctionalComponent,
|
|
|
createCommentVNode,
|
|
|
- Fragment
|
|
|
+ Fragment,
|
|
|
+ withModifiers
|
|
|
} from '@vue/runtime-dom'
|
|
|
import { PatchFlags } from '@vue/shared/src'
|
|
|
|
|
|
@@ -383,6 +384,45 @@ describe('attribute fallthrough', () => {
|
|
|
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() {
|