test(vapor): test case for dom event handling

This commit is contained in:
Evan You 2025-02-12 16:41:35 +08:00
parent d48706336a
commit 8254b5f5ef
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 108 additions and 1 deletions

View File

@ -0,0 +1,106 @@
import { effectScope } from '@vue/reactivity'
import {
delegate,
delegateEvents,
on,
renderEffect,
setDynamicEvents,
} from '../../src'
describe('dom event', () => {
delegateEvents('click')
test('on', () => {
const el = document.createElement('div')
const handler = vi.fn()
on(el, 'click', handler)
el.click()
expect(handler).toHaveBeenCalled()
})
test('delegate with direct attachment', () => {
const el = document.createElement('div')
document.body.appendChild(el)
const handler = vi.fn()
;(el as any).$evtclick = handler
el.click()
expect(handler).toHaveBeenCalled()
})
test('delegate', () => {
const el = document.createElement('div')
document.body.appendChild(el)
const handler = vi.fn()
delegate(el, 'click', handler)
el.click()
expect(handler).toHaveBeenCalled()
})
test('delegate with stopPropagation', () => {
const parent = document.createElement('div')
const child = document.createElement('div')
parent.appendChild(child)
document.body.appendChild(parent)
const parentHandler = vi.fn()
delegate(parent, 'click', parentHandler)
const childHandler = vi.fn(e => e.stopPropagation())
delegate(child, 'click', childHandler)
child.click()
expect(parentHandler).not.toHaveBeenCalled()
expect(childHandler).toHaveBeenCalled()
})
test('delegate with stopImmediatePropagation', () => {
const parent = document.createElement('div')
const child = document.createElement('div')
parent.appendChild(child)
document.body.appendChild(parent)
const parentHandler = vi.fn()
delegate(parent, 'click', parentHandler)
const childHandler = vi.fn(e => e.stopImmediatePropagation())
delegate(child, 'click', childHandler)
child.click()
expect(parentHandler).not.toHaveBeenCalled()
expect(childHandler).toHaveBeenCalled()
})
test('delegate with multiple handlers', () => {
const el = document.createElement('div')
document.body.appendChild(el)
const handler1 = vi.fn()
const handler2 = vi.fn()
delegate(el, 'click', handler1)
delegate(el, 'click', handler2)
el.click()
expect(handler1).toHaveBeenCalled()
expect(handler2).toHaveBeenCalled()
})
test('delegate with multiple handlers + stopImmediatePropagation', () => {
const el = document.createElement('div')
document.body.appendChild(el)
const handler1 = vi.fn(e => e.stopImmediatePropagation())
const handler2 = vi.fn()
delegate(el, 'click', handler1)
delegate(el, 'click', handler2)
el.click()
expect(handler1).toHaveBeenCalled()
expect(handler2).not.toHaveBeenCalled()
})
test('setDynamicEvents', () => {
const el = document.createElement('div')
const handler = vi.fn()
const scope = effectScope()
scope.run(() => {
renderEffect(() => {
setDynamicEvents(el, {
click: handler,
})
})
})
el.click()
expect(handler).toHaveBeenCalled()
scope.stop()
})
})

View File

@ -89,6 +89,7 @@ const delegatedEventHandler = (e: Event) => {
}
} else {
handlers(e)
if (e.cancelBubble) return
}
}
node =
@ -103,6 +104,6 @@ export function setDynamicEvents(
events: Record<string, (...args: any[]) => any>,
): void {
for (const name in events) {
on(el, name, () => events[name], { effect: true })
on(el, name, events[name], { effect: true })
}
}