검색 결과 화면에서 유저가 브라우저 스크롤 바를 끝까지 이동시켰을 경우, 그 다음 페이지를 로딩하도록 만들어야 합니다.

엘리먼트의 크기와 뷰포트 정보 구하기 + 스크롤 이벤트 걸기

<aside> 💡 **Element.getBoundingClientRect() :**메서드는 엘리먼트의 크기와 뷰포트에 상대적인 위치 정보를 제공하는 DOMRect 객체를 반환.

https://developer.mozilla.org/ko/docs/Web/API/Element/getBoundingClientRect

Untitled

</aside>

Untitled

// 요소가 화면에 보이는지 여부 확인.
isElementInViewport(el){
  const rect = el.getBoundingClientRect();
  return(
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
}
// 스크롤 이벤트
**applyEventToElement = (items) => {
  document.addEventListener('scroll', () => {
    items.forEach(el => {
      console.log(el);
			this.isElementInViewport(el);   //화면에 현재 엘리먼트가 보이는지 확인.
    })
  })
}**

  render() {
    this.$searchResult.innerHTML = this.data
      .map(
        cat => `
          <li class="item">
            <img src=${cat.url} alt=${cat.name} />
          </li>
        `
      )
      .join("");

    this.$searchResult.querySelectorAll(".item").forEach(($item, index) => {
      $item.addEventListener("click", () => {
        this.onClick(this.data[index]);
      });
    });

    **let listItems = this.$searchResult.querySelectorAll(".item");
    this.applyEventToElement(listItems);**

  }
}

마지막 요소가 화면에 보이는 시점 확인.

// 요소가 화면에 보이는지 여부 확인.
**isElementInViewport(el){
  const rect = el.getBoundingClientRect();
  return(
    rect.top >= 0 &&
    rect.left >= 0 &&
    rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
    rect.right <= (window.innerWidth || document.documentElement.clientWidth)
    );
}**
  
// 스크롤 이벤트
applyEventToElement = (items) => {
  document.addEventListener('scroll', () => {
    items.forEach((el, index) => {
      **if(this.isElementInViewport(el) && (items.length - 1 === index)){**   
        // 해당 엘리먼트가 화면에 나오면서 == 화면에 현재 엘리먼트가 보이는지 확인.
        // 마지막 요소에 이벤트가 걸릴 때 == 마지막 인덱스일 때
        **console.log('마지막!', el)**
        // 다음 페이지 호출.
      **}**  
    });
  })
}

  render() {
    this.$searchResult.innerHTML = this.data
      .map(
        cat => `
          <li class="item">
            <img src=${cat.url} alt=${cat.name} />
          </li>
        `
      )
      .join("");

    this.$searchResult.querySelectorAll(".item").forEach(($item, index) => {
      $item.addEventListener("click", () => {
        this.onClick(this.data[index]);
      });
    });

    let listItems = this.$searchResult.querySelectorAll(".item");
    this.applyEventToElement(listItems);

  }
}

스크롤 이벤트 App.js에 등록