Skip to content

Commit eb700b9

Browse files
askwuxuecrazylxr
andauthored
feat: support for array as event parameter in useEventListener (alibaba#2598)
* style: change the default import to import on demand * feat: support for array as event parameter in useEventListener * feat: review后修改 --------- Co-authored-by: lxr <1076629390@qq.com>
1 parent 7947903 commit eb700b9

File tree

5 files changed

+90
-19
lines changed

5 files changed

+90
-19
lines changed

packages/hooks/src/useEventListener/__tests__/index.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,34 @@ describe('useEventListener', () => {
3232
expect(state).toBe(1);
3333
});
3434

35+
it('test on event list listener', async () => {
36+
let state: number = 0;
37+
const onClick = () => {
38+
state++;
39+
};
40+
const onKeydown = () => {
41+
state++;
42+
};
43+
const { rerender, unmount } = renderHook(
44+
() => (
45+
useEventListener('click', onClick, { target: () => container }),
46+
useEventListener('keydown', onKeydown, { target: () => container })
47+
),
48+
);
49+
50+
document.body.click();
51+
document.body.dispatchEvent(new KeyboardEvent('keydown'));
52+
expect(state).toBe(0);
53+
rerender();
54+
container.click();
55+
container.dispatchEvent(new KeyboardEvent('keydown'));
56+
expect(state).toBe(2);
57+
unmount();
58+
document.body.click();
59+
document.body.dispatchEvent(new KeyboardEvent('keydown'));
60+
expect(state).toBe(2);
61+
});
62+
3563
it('test "enable" parameter', () => {
3664
let state = 0;
3765
let enable = true;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* title: Listen to multiple events.
3+
* desc: Mouse hover or over the button to preview.
4+
*
5+
* title.zh-CN: 监听多个事件
6+
* desc.zh-CN: 鼠标移入移出按钮查看效果。
7+
*/
8+
9+
import React, { useRef, useState } from 'react';
10+
import { useEventListener } from 'ahooks';
11+
12+
export default () => {
13+
const ref = useRef(null);
14+
const [value, setValue] = useState('');
15+
16+
useEventListener(
17+
['mouseenter', 'mouseleave'],
18+
(ev) => {
19+
setValue(ev.type);
20+
},
21+
{ target: ref },
22+
);
23+
24+
return (
25+
<button ref={ref} type="button">
26+
You Option is {value}
27+
</button>
28+
);
29+
};

packages/hooks/src/useEventListener/index.en-US.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ Use addEventListener elegant by Hook.
1717

1818
<code src="./demo/demo2.tsx" />
1919

20+
### Listen for multiple events
21+
22+
<code src="./demo/demo3.tsx" />
23+
2024
## API
2125

2226
```typescript
@@ -29,11 +33,11 @@ useEventListener(
2933

3034
### Property
3135

32-
| Property | Description | type | default |
33-
| --------- | ---------------------- | --------------------- | ------- |
34-
| eventName | Event name | `string` | - |
35-
| handler | Callback function | `(ev: Event) => void` | - |
36-
| options | More options(optional) | `Options` | - |
36+
| Property | Description | type | default |
37+
| --------- | ---------------------- | ---------------------- | ------- |
38+
| eventName | Event name | `string` \| `string[]` | - |
39+
| handler | Callback function | `(ev: Event) => void` | - |
40+
| options | More options(optional) | `Options` | - |
3741

3842
### Options
3943

packages/hooks/src/useEventListener/index.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ function useEventListener<K extends keyof WindowEventMap>(
3636
options?: Options<Window>,
3737
): void;
3838
function useEventListener(
39-
eventName: string,
39+
eventName: string | string[],
4040
handler: (event: Event) => void,
4141
options?: Options<Window>,
4242
): void;
43-
function useEventListener(eventName: string, handler: noop, options: Options): void;
43+
function useEventListener(eventName: string | string[], handler: noop, options: Options): void;
4444

45-
function useEventListener(eventName: string, handler: noop, options: Options = {}) {
45+
function useEventListener(eventName: string | string[], handler: noop, options: Options = {}) {
4646
const { enable = true } = options;
4747

4848
const handlerRef = useLatest(handler);
@@ -62,15 +62,21 @@ function useEventListener(eventName: string, handler: noop, options: Options = {
6262
return handlerRef.current(event);
6363
};
6464

65-
targetElement.addEventListener(eventName, eventListener, {
66-
capture: options.capture,
67-
once: options.once,
68-
passive: options.passive,
65+
const eventNameArray = Array.isArray(eventName) ? eventName : [eventName];
66+
67+
eventNameArray.forEach((event) => {
68+
targetElement.addEventListener(event, eventListener, {
69+
capture: options.capture,
70+
once: options.once,
71+
passive: options.passive,
72+
});
6973
});
7074

7175
return () => {
72-
targetElement.removeEventListener(eventName, eventListener, {
73-
capture: options.capture,
76+
eventNameArray.forEach((event) => {
77+
targetElement.removeEventListener(event, eventListener, {
78+
capture: options.capture,
79+
});
7480
});
7581
};
7682
},

packages/hooks/src/useEventListener/index.zh-CN.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ nav:
1717

1818
<code src="./demo/demo2.tsx" />
1919

20+
### 监听多个事件
21+
22+
<code src="./demo/demo3.tsx" />
23+
2024
## API
2125

2226
```typescript
@@ -29,11 +33,11 @@ useEventListener(
2933

3034
### Params
3135

32-
| 参数 | 说明 | 类型 | 默认值 |
33-
| --------- | ---------- | --------------------- | ------ |
34-
| eventName | 事件名称 | `string` | - |
35-
| handler | 处理函数 | `(ev: Event) => void` | - |
36-
| options | 设置(可选) | `Options` | - |
36+
| 参数 | 说明 | 类型 | 默认值 |
37+
| --------- | ---------- | ---------------------- | ------ |
38+
| eventName | 事件名称 | `string` \| `string[]` | - |
39+
| handler | 处理函数 | `(ev: Event) => void` | - |
40+
| options | 设置(可选) | `Options` | - |
3741

3842
### Options
3943

0 commit comments

Comments
 (0)