|
1 |
| -import { useRef, useEffect, useMemo } from 'react'; |
| 1 | +/* eslint-disable max-params */ |
| 2 | +import { useRef, useEffect } from 'react'; |
2 | 3 |
|
3 |
| -const useEventListener = (eventName, handler, element = global, options) => { |
| 4 | +const useEventListener = ( |
| 5 | + eventName, |
| 6 | + handler, |
| 7 | + element = global, |
| 8 | + options = {} |
| 9 | +) => { |
4 | 10 | const savedHandler = useRef();
|
| 11 | + const { capture, passive, once } = options; |
5 | 12 |
|
6 | 13 | useEffect(() => {
|
7 | 14 | savedHandler.current = handler;
|
8 | 15 | }, [handler]);
|
9 | 16 |
|
10 |
| - const capture = options ? options.capture : undefined; |
11 |
| - const passive = options ? options.passive : undefined; |
12 |
| - |
13 |
| - // Rerun the effect only if capture or passive has actually changed |
14 |
| - const memoOptions = useMemo(() => ({ capture, passive }), [capture, passive]); |
15 |
| - |
16 |
| - useEffect( |
17 |
| - () => { |
18 |
| - const isSupported = element && element.addEventListener; |
19 |
| - if (!isSupported) return; |
| 17 | + useEffect(() => { |
| 18 | + const isSupported = element && element.addEventListener; |
| 19 | + if (!isSupported) { |
| 20 | + return; |
| 21 | + } |
20 | 22 |
|
21 |
| - const eventListener = event => savedHandler.current(event); |
22 |
| - element.addEventListener(eventName, eventListener, memoOptions); |
23 |
| - return () => { |
24 |
| - element.removeEventListener(eventName, eventListener, memoOptions); |
25 |
| - }; |
26 |
| - }, |
27 |
| - [eventName, element, memoOptions] |
28 |
| - ); |
| 23 | + const eventListener = (event) => savedHandler.current(event); |
| 24 | + const opts = { capture, passive, once }; |
| 25 | + element.addEventListener(eventName, eventListener, opts); |
| 26 | + return () => { |
| 27 | + element.removeEventListener(eventName, eventListener, opts); |
| 28 | + }; |
| 29 | + }, [eventName, element, capture, passive, once]); |
29 | 30 | };
|
30 | 31 |
|
31 | 32 | export default useEventListener;
|
0 commit comments