전체 데이터를 받아 FrontEnd에서 처리 하는 무한스크롤
const [dataList, setDataList] = useState([]);
const [hiddenDataList, setHiddenDataList] = useState([]); //랜더링하기 전 숨겨놓는 데이터(스크롤 할 때마다 -)
const [isLoading, setIsLoading] = useState(true); //무한스크롤 시 카드 로딩
const fetchMoreData = async () => {
//카드를 더 추가로 받아오는 함수
if (hiddenDataList.length !== 0) {
//안보여준 카드가 남아있을 때만
setIsLoading(true);
setTimeout(() => {
setDataList([...dataList, ...hiddenDataList.slice(0, 8)]);
setHiddenDataList(hiddenDataList.slice(8));
setIsLoading(false);
}, 700);
}
};
setTimeout
으로isLoading
의 상태를 바뀔 수 있는 시간을 준다. const infiniteScroll = useCallback(() => {
//스크롤 높이 및 정도 감지하여, 조건 만족하면 fetchMoreData 함수 호출
let scrollHeight = Math.max(
document.documentElement.scrollHeight,
document.body.scrollHeight
);
let scrollTop = Math.max(
document.documentElement.scrollTop,
document.body.scrollTop
);
let clientHeight = document.documentElement.clientHeight;
scrollHeight -= 100;
if (scrollTop + clientHeight >= scrollHeight && isLoading === false) {
fetchMoreData();
}
}, [isLoading]);
fetchMoreData
를 호출 실행 useEffect(() => {
const getFetchData = () => {
//페이지'최초' 랜더링때에만 작동
setIsLoading(true);
fetch('http://localhost:3000/data/MockData.json')
.then(res => res.json())
.then(data => {
// setDataList(data); --> 이렇게 다 보여주는 대신에
setDataList(data.slice(0, 8)); //최초에 8개만 보여주고
setHiddenDataList(data.slice(8)); //보여준 8개 제외한 나머지만 추려서상태값에 저장
setIsLoading(false);
});
};
getFetchData();
}, []);
dataList
에 상품리스트를 채워주는 곳 useEffect(() => {
window.addEventListener('scroll', infiniteScroll, true); // 스크롤 이벤트 등록
return () => window.removeEventListener('scroll', infiniteScroll, true); //스크롤 이벤트 삭제(컴포넌트 언마운트시)
}, [infiniteScroll]);