useIntersectionObserver
Intersection Observer API를 사용하여 요소의 가시성 변화를 관찰하는 Hook입니다. 무한 스크롤, 이미지 레이지 로딩 등에 유용합니다.
Props
| 이름 | 타입 | 설명 | 기본값 |
|---|---|---|---|
| root | Element | null | 가시성을 확인할 뷰포트 요소, 뷰포트를 지정하지 않을 경우 브라우저의 뷰포트를 사용합니다. | null |
| rootMargin | string | 루트 요소의 마진 | '0px' |
| threshold | number | number[] | 콜백 실행 시점의 가시성 퍼센티지 (0~1) | 0 |
| onChange | (entry: IntersectionObserverEntry) => void | 가시성 변경 시 호출되는 콜백 | - |
| onEnter | () => void | 요소가 뷰포트에 진입 시 호출되는 콜백 | - |
| onLeave | () => void | 요소가 뷰포트에서 벗어날 때 호출되는 콜백 | - |
| unobserveOnEnter | boolean | 진입 후 관찰 중지 여부 | false |
| unobserveOnLeave | boolean | 관측된 후 뷰포트에서 벗어날 때 관찰 중지 여부 | false |
Return
ref: 관찰할 요소에 연결할 ref 객체observe: 관찰 시작 함수unobserve: 관찰 중지 함수
Usage
tsx
import { useIntersectionObserver } from '@teamsparta/react';
function Example() {
const { ref } = useIntersectionObserver({
onEnter: () => console.log('요소가 화면에 나타남'),
onLeave: () => console.log('요소가 화면에서 사라짐'),
});
return <div ref={ref}>관찰할 요소</div>;
}Example
무한 스크롤
tsx
function InfiniteScroll() {
const [items, setItems] = useState<string[]>([]);
const [isLoading, setIsLoading] = useState(false);
const { ref } = useIntersectionObserver({
onEnter: async () => {
if (isLoading) return;
setIsLoading(true);
const newItems = await fetchMoreItems();
setItems((prev) => [...prev, ...newItems]);
setIsLoading(false);
},
});
return (
<div>
{items.map((item) => (
<div key={item}>{item}</div>
))}
<div ref={ref}>{isLoading ? '로딩 중...' : '더 보기'}</div>
</div>
);
}