스크롤이 일어날 때 마다 핸들러를 동작시키는것은 자바스크립트의 메인엔진에서 실행 되어야하므로 많은 부하가 걸리는데, 이를 해결해 줄 수 있는게 IntersectionObserver 이다
return(
<ul>
list.map(item => (
<li>item</li>
))
</ul>
<div ref={targetRef}></div>
)
const handleIntersect = () => {
noticePayload.page = noticePayload.page + 1
getList()
}
useEffect(() => {
const options = {
root: null,
rootMargin: '30px',
};
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) handleIntersect();
}, options);
//targetRef.current or targetRef
observer.observe(targetRef.current);
},[])
//hooks
import { useEffect, useRef } from 'react'
export const useObserver = (
navNumber: number,
setNavNumber: React.Dispatch<React.SetStateAction<number>>,
) => {
const options = {}
const refElement = useRef<HTMLDivElement>(null)
useEffect(() => {
const osv = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
setNavNumber(navNumber)
} else {
setNavNumber(0)
}
}, options)
if (refElement.current) {
osv.observe(refElement.current)
}
return () => osv.disconnect()
}, [])
return refElement
}
//component
const [isFocused, setIsFocused] = useState(0)
const refCurrent = useObserver(1, setIsFocused)
useEffect(() => {
console.log({ isFocused }) // isFocused > 0 && 이벤트 실행
}, [isFocused])