useRef() hook to create a variable, listener, which will hold the listener reference.useRef() hook to create a variable that will hold the previous values of the type and options arguments.useEffect() hook and EventTarget.addEventListener() to listen to the given event type on the window global object.EventTarget.removeEventListener() to remove any existing listeners and clean up when the component unmounts.const useOnGlobalEvent = (type, callback, options) => {
const listener = React.useRef(null);
const previousProps = React.useRef({ type, options });
React.useEffect(() => {
const { type: previousType, options: previousOptions } = previousProps;
if (listener.current) {
window.removeEventListener(
previousType,
listener.current,
previousOptions
);
}
listener.current = window.addEventListener(type, callback, options);
previousProps.current = { type, options };
return () => {
window.removeEventListener(type, listener.current, options);
};
}, [callback, type, options]);
};
const App = () => {
useOnGlobalEvent('mousemove', e => {
console.log(`(${e.x}, ${e.y})`);
});
return <p>Move your mouse around</p>;
};
ReactDOM.render(<App />, document.getElementById('root'));Subscribe to get resources directly to your inbox. You won't receive any spam! ✌️