@etsoo/react
Version:
TypeScript ReactJs UI Independent Framework
64 lines (53 loc) • 1.28 kB
text/typescript
import React from "react";
/**
* Window scroll position
*/
export interface IScrollPos {
x: number;
y: number;
}
/**
* Detect window scroll
* @returns Scroll location
*/
export const useWindowScroll = () => {
// State
const [pos, setPos] = React.useState<IScrollPos>({
x: window.scrollX,
y: window.scrollY
});
React.useEffect(() => {
let ticking = false;
let lastPos: IScrollPos;
let requestAnimationFrameSeed = 0;
const scrollHandler = () => {
lastPos = {
x: window.scrollX,
y: window.scrollY
};
if (!ticking) {
requestAnimationFrameSeed = window.requestAnimationFrame(() => {
ticking = false;
requestAnimationFrameSeed = 0;
if (lastPos.x != pos.x || lastPos.y != pos.y) {
setPos(lastPos);
}
});
ticking = true;
}
};
window.addEventListener("scroll", scrollHandler, {
passive: true,
capture: false
});
return () => {
// Cancel animation frame
if (requestAnimationFrameSeed > 0)
window.cancelAnimationFrame(requestAnimationFrameSeed);
// Remove scroll event
window.removeEventListener("scroll", scrollHandler);
};
}, []);
// Return
return pos;
};