一个小 hooks
const useScrollY = () => {
const [scrollY, setScrollY] = useState(() => window.scrollY)
const requestRef = useRef()
useEffect(() => {
const animate = () => setScrollY(window.scrollY)
const handleScroll = () => {
cancelAnimationFrame(requestRef.current)
requestRef.current = requestAnimationFrame(animate)
}
window.addEventListener("scroll", handleScroll)
return () => {
window.removeEventListener("scroll", handleScroll)
cancelAnimationFrame(requestRef.current)
}
}, [])
return scrollY
}
另一个小 hooks
const useAnimationFrame = callback => {
// Use useRef for mutable variables that we want to persist
// without triggering a re-render on their change
const requestRef = React.useRef()
const previousTimeRef = React.useRef()
const animate = time => {
if (previousTimeRef.current != undefined) {
const deltaTime = time - previousTimeRef.current
callback(deltaTime)
}
previousTimeRef.current = time
requestRef.current = requestAnimationFrame(animate)
}
React.useEffect(() => {
requestRef.current = requestAnimationFrame(animate)
return () => cancelAnimationFrame(requestRef.current)
}, [])
}