Skip to content

Instantly share code, notes, and snippets.

@antoniocapelo
Last active July 8, 2019 09:57
Show Gist options
  • Select an option

  • Save antoniocapelo/95dc3e25cd495191d78afac905d344d4 to your computer and use it in GitHub Desktop.

Select an option

Save antoniocapelo/95dc3e25cd495191d78afac905d344d4 to your computer and use it in GitHub Desktop.
Custom React Hook for setting a passive scroll listener and get updated scrollY and scroll direction information
/**
* useScrollListener hook
* Usage: const { scrollY, scrollDirection } = useScrollListener();
*/
import { useReducer, useEffect } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'set':
return {
scrollY: action.payload.scrollY,
scrollDirection: action.payload.scrollY > state.scrollY ? 'down' : 'up'
};
}
}
export function useScrollListener() {
const [state, dispatch] = useReducer(reducer, {
scrollY: 0,
scrollDirection: 'down'
});
function listener() {
const scrollTop =
document.documentElement.scrollTop || document.body.scrollTop;
dispatch({
type: 'set',
payload: {
scrollY: scrollTop
}
});
}
useEffect(() => {
window.addEventListener('scroll', listener, false);
return () => {
window.removeEventListener('scroll', listener, false);
};
}, []);
return {
...state
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment