import React, { useEffect, useState } from "react";
// KUCC 리액트 세션: 7.무한스크롤(클래스 컴포넌트 ver.)(https://infpidealistdeveloper.tistory.com/54)의 코드를
함수형 컴포넌트로 다시 짠 코드입니다.
const Allitem = () => {
const [state, setState] = useState({
productList: [], //상품의 배열
items: 10, //요청하는 상품의 끝 인덱스
preItems: 0, //요청하는 상품의 첫 인덱스
}); // state의 초기값 설정
useEffect(() => { //생명주기에서 componentDidMount, componentDidUpdate(mount, update)와 동일 기능
getData(); //정보 요청
window.addEventListener("scroll", infiniteScroll); //scroll이 발생할때마다 infiniteScroll 함수 실행하는 이벤트 추가
return () => { //생명주기에서 componentWillUnmount와 동일 기능
window.removeEventListener("scroll", infiniteScroll); //scroll이 발생할때마다 infiniteScroll 함수 실행하는 이벤트 제거
};
}, []); //dependency 옵션으로 componentDidMount/componentDidUpdate 결정
: 없으면 매번 렌더링, [ ] : 한번만 렌더링, [어떤 조건 ex. user] : 괄호 안 조건, 상수가 변할 때마다 실행
const getData = () => {
const { preItems, items, productList } = state;
// state변수 안에 있는 각각 preItems, items, productList와 구조 분해 할당
fetch("/Data/mock.json")
.then((res) => res.json())
.then((res) => {
const result = res.data.slice(preItems, items); //data 10개씩 가져옴, 위에서 선언한 상수 활용
setState({
productList: [...productList, ...result], //state의 productList에 가져와서 가공한 result 추가
});
});
};
const infiniteScroll = () => {
const { documentElement, body } = document;
// const documentElement = document.documentElement, const body = document.body
const { items } = state;
// document, state 안에 있는 동명 요소들과 구조 분해 할당
// 각 높이에 대한 설명은 https://velog.io/@hyounglee/TIL-56의 설명 참조
const scrollHeight = Math.max(documentElement.scrollHeight, body.scrollHeight);
const scrollTop = Math.max(documentElement.scrollTop, body.scrollTop);
const clientHeight = documentElement.clientHeight;
//우리가 원하는 스크롤이벤트 실행하는 부분입니다.
if (scrollTop + clientHeight >= scrollHeight) {
setState({
preItems: items,
items: items + 10,
});
getData();
//result에 json화한(정리한) 정보를 productList에 ...result로 풀어서 추가한다
//result에 넣을 정보를 indexing할 preItems, items를 10씩 차이가 나도록 설정해
getData할 때마다 10씩 정보를 불러오도록 한다
}
};
const { productList } = state;
//state의 productList를 가져온다
return (
<article className="Allitem">
<div className="topInfo">
<div className="totalItems">{productList}</div>
//마지막에 다시 productList를 불러와서 10씩 추가
</div>
</article>
);
};
export default Allitem;
*React를 사용하다보면 과거에는 class를 더 많이 쓰고 요즘은 함수형 많이 써서 전환하는 방법 알고 있기!
'REACT' 카테고리의 다른 글
[React] KUCC 리액트 세션 7. 무한 스크롤[클래스 컴포넌트 ver.] (0) | 2021.05.19 |
---|---|
[React]KUCC 리액트 세션: 6. Lifecycle (1) | 2021.05.18 |
[React]KUCC 리액트 세션: 5.Hook (1) | 2021.05.18 |
[React]KUCC 리액트 세션: 4. State와 생명주기 (1) | 2021.05.18 |
[React]KUCC 리액트 세션: 3. Component과 props (1) | 2021.05.18 |