From e76941f2f139895e44129c597a5d80d2ff845c3c Mon Sep 17 00:00:00 2001 From: Chalarangelo Date: Mon, 8 Nov 2021 15:52:33 +0200 Subject: [PATCH] Add onWindow hooks --- snippets/useOnWindowResize.md | 37 +++++++++++++++++++++++++++++++++++ snippets/useOnWindowScroll.md | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 snippets/useOnWindowResize.md create mode 100644 snippets/useOnWindowScroll.md diff --git a/snippets/useOnWindowResize.md b/snippets/useOnWindowResize.md new file mode 100644 index 000000000..c929f7011 --- /dev/null +++ b/snippets/useOnWindowResize.md @@ -0,0 +1,37 @@ +--- +title: useOnWindowResize +tags: hooks,effect,intermediate +firstSeen: 2021-12-01T05:00:00-04:00 +--- + +Executes a callback whenever the window is resized. + +- Use the `useRef()` hook to create a variable, `listener`, which will hold the listener reference. +- Use the `useEffect()` hook and `EventTarget.addEventListener()` to listen to the `'resize'` event of the `window` global object. +- Use `EventTarget.removeEventListener()` to remove any existing listeners and clean up when the component unmounts. + +```jsx +const useOnWindowResize = callback => { + const listener = React.useRef(null); + + React.useEffect(() => { + if (listener.current) + window.removeEventListener('resize', listener.current); + listener.current = window.addEventListener('resize', callback); + return () => { + window.removeEventListener('resize', listener.current); + }; + }, [callback]); +}; +``` + +```jsx +const App = () => { + useOnWindowResize(() => + console.log(`window size: (${window.innerWidth}, ${window.innerHeight})`) + ); + return

Resize the window and check the console

; +}; + +ReactDOM.render(, document.getElementById('root')); +``` diff --git a/snippets/useOnWindowScroll.md b/snippets/useOnWindowScroll.md new file mode 100644 index 000000000..f31fb7756 --- /dev/null +++ b/snippets/useOnWindowScroll.md @@ -0,0 +1,35 @@ +--- +title: useOnWindowScroll +tags: hooks,effect,intermediate +firstSeen: 2021-12-08T05:00:00-04:00 +--- + +Executes a callback whenever the window is scrolled. + +- Use the `useRef()` hook to create a variable, `listener`, which will hold the listener reference. +- Use the `useEffect()` hook and `EventTarget.addEventListener()` to listen to the `'scroll'` event of the `window` global object. +- Use `EventTarget.removeEventListener()` to remove any existing listeners and clean up when the component unmounts. + +```jsx +const useOnWindowScroll = callback => { + const listener = React.useRef(null); + + React.useEffect(() => { + if (listener.current) + window.removeEventListener('scroll', listener.current); + listener.current = window.addEventListener('scroll', callback); + return () => { + window.removeEventListener('scroll', listener.current); + }; + }, [callback]); +}; +``` + +```jsx +const App = () => { + useOnWindowScroll(() => console.log(`scroll Y: ${window.pageYOffset}`)); + return

Scroll and check the console

; +}; + +ReactDOM.render(, document.getElementById('root')); +```