칵테일 레시피 공유 프로젝트를 제작하면서
칵테일 레시피 목록을 보여주는 방법은 무한 스크롤로 적용하게되었다
목록을 보여주기 위한 방법에는 페이지를 나누는 페이지 네이션과 무한 스크롤 등의 방법이 있었고,
무한 스크롤이 사용자 경험에 더 긍정적이라고 생각하여 무한 스크롤로 적용하게 되었다
맞는 방법인지는 모르겠지만, 구글링을 통해 얻은 정보를 통해 구현하게 되었다.
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
});
useEffect hook을 통해 해당 컴포넌트가 렌더링되면 스크롤을 감지한다
const handleScroll = async () => {
if (
window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight &&
!isEnd
) {
setAddFetching(true);
const data = await requestList(count + 12, query);
if (data.length !== 0) {
dispatch(addArticleList(data));
setCount(count + 12);
} else {
setIsEnd(true);
}
setAddFetching(false);
}
};
스크롤의 밑 부분(window.innerHeight + window.scrollY)이 페이지의 바닥에 닿으면 추가적인 fetching을 하도록 구현하였다
count는 데이터를 받아올 첫 index를 기록하며, fetching시 서버에 함께 보내도록 하였다
그렇게 되면 서버는 count부터 12개의 게시물을 보내준다
받아온 데이터가 있다면 다음 받아올 게시물을 위해 count를 12 늘려주었고, isEnd가 true라면 count를 늘리지 않는다.
이때, isEnd는 서버를 통해 받은 데이터의 길이가 0이면 isEnd state를 변경하여 더 이상 받아올 데이터가 없음을 구분하도록 하였다
setAddFetching은 로딩 인디케이터를 보여주기 위해 fetch의 시작점과 끝지점에서 변경되도록 작성하였다.