본문 바로가기
  • 성장일기
공부/React

Infinite Scroll 구현하기

by 3000 2021. 7. 9.

Scroll event, IntersectionObserver와 같이 여러 방법이 있지만, IntersectionObserver를 간편히 사용할 수 있는 React Hook react-intersection-observer로 Infinite Scroll을 구현하는 방법을 소개하겠습니다.

Infinite Scroll을 구현하긴 위해서 통신을 할 때 정해진 양만큼의 데이터를 받아와야 합니다.

예를들어, 처음 받은 데이터가 5개이고, 스크롤을 내렸을 때 5개의 데이터를 추가로 받아오는 방식입니다.

5
5+5
5+5+5

사용 방법을 알아보기 전에 먼저

IntersectionObserver이 무엇인지 간단하게 설명하자면, 대상이 화면에 보이면 callback 함수를 실행하여 원하는 동작을 수행할 수 있도록 타겟을 감시하는 역할을 합니다.

IntersectionObserver mdn.


Install

npm install react-intersection-observer

Usage

import { useInView } from 'react-intersection-observer'; 

const App = () => {
  const { ref, inView } = useInView(options);
  // ref가 화면에 나타나면 inView는 true, 아니면 false를 반환한다.

  return (
    <div>
      <ul>
        <li />
        <li />
        <li />
      </ul>
      <div ref={ref}></div> // 확인할 부분에 ref 할당
    </div>
  )
}

화면에 보이는지 확인할 타겟은 스크롤의 가장 마지막에 넣고, 이부분이 보이면 InView는 true가 됩니다. 그럼 InView의 상태를 확인해서 true일 경우 다음 데이터를 받아오면 되겠죠?

  useEffect(() => {
    if (inView && !loading) {
      // 예시
      page+1
      fetchMore({page});
    }
  }, [inView, loading]);

Options

root : 대상에 대한 경계를 지정합니다. 지정하지 않는다면 뷰포트를 경계로 지정합니다.
rootMargin : root에 대한 margin을 설정합니다. 이는 CSS의 margin과 비슷합니다.
threshold : 0.0~1.0까지 값을 지정할 수 있으며, 루트와 대상의 교차 영역을 비율로 지정합니다. 예를들어 0.0은 단 하나의 픽셀이라도 보여지면, 1.0은 전체 대상이 보이게 됨을 의미합니다.

이외에도 여러 옵션이 있지만, 자세한 내용은 react-intersection-observer.에서 확인하시는게 더 좋습니다.

반응형

댓글