Skip to content
This repository has been archived by the owner on Jun 5, 2023. It is now read-only.

Commit

Permalink
feat(Hooks): New useEventListener hook
Browse files Browse the repository at this point in the history
  • Loading branch information
diondiondion committed Oct 1, 2019
1 parent 0d0b1dd commit b3ea602
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ export {default as TextLink} from './TextLink';
export {default as ThemeSection} from './ThemeSection';
export {default as Time} from './Time';
export {default as useBreakpoints} from './useBreakpoints';
export {default as useEventListener} from './useEventListener';
export {default as useInterval} from './useInterval';
export {default as ViewMoreText} from './ViewMoreText';
export {default as VisuallyHidden} from './VisuallyHidden';
20 changes: 20 additions & 0 deletions src/useEventListener/README.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
---
name: useEventListener
menu: Hooks
---

# useEventListener

A simple hook that adds a global event listener & cleans up after it when the component unmounts.

By default, the event listener is added on `document`, but you can change the element by passing a custom target element to it as the third parameter.

## Examples

```js
useEventListener('click', onBodyClick);
```

```js
useEventListener('scroll', onScroll, scrollContainerRef.current);
```
21 changes: 21 additions & 0 deletions src/useEventListener/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import {useEffect, useRef} from 'react';

function useEventListener(eventName, callback, element = document) {
const callbackRef = useRef(callback);

useEffect(() => {
callbackRef.current = callback;
}, [callback]);

useEffect(() => {
const currentCallback = callbackRef.current;

element.addEventListener(eventName, currentCallback);

return function cleanUp() {
element.removeEventListener(eventName, currentCallback);
};
}, [eventName, element]);
}

export default useEventListener;

0 comments on commit b3ea602

Please sign in to comment.