개발관련/리액트

리액트 컴포넌트 무한 스크롤 구현

2023. 5. 11. 19:57
목차
  1. 무한 스크롤 컴포넌트
  2. 사용법
  3. 해설
반응형

무한 스크롤 컴포넌트

import React, { useState, useEffect, useRef, FC } from "react";

interface Props {
  fetchData: () => Promise<void>;
  children: React.ReactNode;
}

const InfiniteScroll: FC<Props> = ({ fetchData, children }) => {
  const [isLoading, setIsLoading] = useState(true);
  const loader = useRef<HTMLDivElement>(null);

  useEffect(() => {
    const observer = new IntersectionObserver(
      (entries) => {
        if (entries[0].isIntersecting) {
          setIsLoading(true);
          fetchData().then((newItems) => {
            setIsLoading(false);
          });
        }
      },
      { threshold: 1 }
    );

    if (loader.current) {
      observer.observe(loader.current);
    }

    return () => {
      observer.disconnect();
    };
  }, [loader, setIsLoading, fetchData]);

  return (
    <div>
      {children}
      <div ref={loader}>
        {isLoading && "로딩..."}
      </div>
    </div>
  );
};

export default InfiniteScroll;

사용법

export const List: React.FC = () => {
  const [page, setPage] = useState(1);
  const [list,setList] = React.useState([])
  const fetchData = async () => {
    const response = await axios.get(`https://api.example.com/data?page=${page}&limit=10`);
    setList(prevData => [...prevData, ...response.data]);
  };
  
  return (
    <InfiniteScroll fetchData={fetchData}>
      <ul>
        {list.map((item,i) => (
          <li key={i}>item</li>
        ))}
      </ul>
    </InfiniteScroll>
  );
};

해설

  1. InfiniteScroll 컴포넌트를 만들어서 재사용 가능하게 합니다.
  2. 재사용성을 높이기 위해서 로딩 상태와 UI를 InfiniteScroll내부에 구현합니다.
  3. 데이터를 저장할 data 상태와 페이지 번호를 저장할 page 상태를 생성합니다.
  4. 페이지 번호가 변경될 때마다 API를 호출하여 데이터를 가져옵니다. 가져온 데이터는 이전 데이터와 합쳐집니다.
  5. Intersection Observer를 설정하여 로딩 요소가 뷰포트와 교차할 때마다 페이지 번호를 증가시킵니다.
  6. 로딩 요소에 ref를 설정하여 Intersection Observer가 관찰할 수 있도록 합니다.
반응형
저작자표시 비영리 변경금지 (새창열림)

'개발관련 > 리액트' 카테고리의 다른 글

react에서 Windowing을 구현해보자  (0) 2023.08.10
[번역] 리액트 기술을 한 단계 업그레이드하세요: 2023년에 마스터할 고급 패턴 5가지  (0) 2023.08.07
CRA test 할때 axios import outside 에러 관련  (0) 2023.05.01
React 프로젝트에서 GZIP 압축 사용하기  (0) 2023.05.01
React-hook-form과 Material UI MUI Select Component 같이 사용 하는 방법  (0) 2022.11.03
  1. 무한 스크롤 컴포넌트
  2. 사용법
  3. 해설
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
개발자 Dane
개발자 Dane
IT / 테크 전문 크리에이터 데인 입니다.
개발자 Dane
개발자 Dane의 IT 전문 블로그
개발자 Dane
반응형
  • 분류 전체보기 (170)
    • 개발관련 (24)
      • 프론트엔드 지식 (11)
      • 매일 코딩 테스트 챌린지 (27)
      • 자바스크립트 팁 (32)
      • 리액트 (11)
    • 얼리어답터 (11)
    • 팁 (13)
    • 게임 (18)
      • 디아블로2레저렉션 (16)
    • 운동하는 후니 (2)
전체
오늘
어제

태그

  • PNP
  • vscode
  • yarn
  • Next.js
  • 바바리안
  • 코딩테스트
  • GOS해제
  • 애플페이
  • 디아블로2레저렉션
  • Gatsby
  • 갤럭시소비자기만
  • javascript
  • 문자열정렬
  • 디아블로2
  • 룬워드방패
  • 레저렉션
  • 자바스크립트
  • docker
  • 갤럭시성능뻥튀기
  • 갤럭시긱벤치
  • AWS
  • s3
  • gos
  • 디아블로4
  • 프로그래머스
  • React
  • 리액트
  • 문자열
  • 도커
  • 아이폰

최근 댓글

hELLO · Designed By 정상우.
개발자 Dane
리액트 컴포넌트 무한 스크롤 구현
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.