일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- flex
- netlify redirect
- SCSS import
- KDT 프로그래머스 데브코스 프론트엔드
- vue 이벤트 수신
- SCSS use
- vue 지역 컴포넌트
- 쌓임맥락
- vue mixin
- 프로그래머스 데브코스
- vuex map
- SCSS forward
- Spacer
- nextjs사용법
- 리스트 렌더링
- KDT 프로그래머스
- 프로그래머스 프론트엔드 데브코스
- SCSS extend
- 리액트
- 다른컴퓨터에서 git사용
- intersection opserver
- 프로그래머스 K_Digital Training
- Vue
- react next
- 프로그래머스 데브코스 프론트엔드
- 이벤트 수식어
- 폼 입력 바인딩
- 고양이 사진 검색기
- git 같은계정 다른 컴퓨터
- postcss
- Today
- Total
혼자 적어보는 노트
프로그래머스 데브코스 TIL - Day 25 본문
✅ 오늘의 학습
- 무한 스크롤 UI 구현하기
- Scroll / intersectionObserver
이전에 next를 하면서 무한 스크롤을 구현한 적있었는데
복습할겸 다시 정리를 해보려고 한다.
버튼 여러 번 클릭 시 중복 요청 제어하기
state에 isLoading 값을 넣고 데이터 요청 시작 시 isLoading값을 false로 주고
데이터를 응답받으면 isLoading값을 true로 주는 방법으로 핸들링 할 수 있다.
$photoList.addEventListener("click", (e) => {
if (e.target.className === "photoList__loadMore" && !this.state.isLoading) {
// this.state의 isLoading이 false여야만 데이터 요청
onScrollEnded();
}
});
scroll을 통한 infinite Scroll
window.innerHeight + window.scrollY >= document.body.offsetHeight;
// 스크롤이 문서의 맨 끝까지 도달 했는지 확인
window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight;
// 스크롤이 문서의 맨끝에서 + 100px 한 곳까지 도달 했는지 확인
현재 높이와 스크롤 된 값을 더한 값을 통해 body의 offsetHeight를 비교하여
스크롤이 문서 끝까지 되었는 지 확인할 수 있다.
문서의 맨 끝인 경우 중복 요청이 되지는 않지만
100px의 여유를 준 경우 문서의 끝에서 -100px부터 0px까지에 닿을 때마다
반복적으로 요청을 보내게 된다.
중복 요청 제어하기
window.addEventListener("scroll", () => {
const isScrollEnded = window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight;
if (isScrollEnded && this.state.isLoading && this.state.photos.length < this.state.totalCount {
onScrollEnded();
}
});
API의 전체 데이터를 모두 불러왔음에도 계속 API요청을 하게 되기 때문에
현재 API내 의 데이터 전체 개수와 현재 내가 불러온 데이터의 개수를 비교하여 제한을 걸어준다.
intersection opserver
이미지 지연로딩 할 때 intersection opserver 활용가능
observe, unobserve 잘 체크하기
threshold 값으로 observe 대상이 얼마나 노출되었는지에 따라 동작하게 할 수 있다.
new IntersectionObserver 사용
const observer = new IntersectionObserver(
(entries) => {
// entries는 여러개를 지정할 수 있다.
entries.forEach((entry) => {
//entry.isIntersecting을 통해 viewport에 해당 entry가 들어왔는 지 알 수 있음.
if (entry.isIntersecting && !this.state.isLoading) {
console.log("화면 끝!");
observer.unobserve(entry.target);
if (this.state.photos.length < this.state.totalCount) {
onScrollEnded();
}
}
});
},
{
threshold: 1, // 보이는 영역이 얼만큼인지 지정. 1로 지정 시 view port에 완전히 들어왔을 때 실행
}
);
observer.observe를 사용한 대상 지정
const $lastLi = $photoList.querySelector(".photoList__photos li:last-child");
// 데이터를 불러와서 만든 맨 마지막의 li를 observe로 지정.
if ($lastLi !== null) {
observer.observe($lastLi);
}
✍ 느낀 점
이전에 접해봤던 개념이였기 때문에 강의 내용 토대로 간단하게 정리하였다.
intersectionObserver의 경우 이전에 딱 한번 해봤기 때문에
그때 당시 약간 헷갈리는 게 있었는데, 이번 강의를 통해서 조금 더 응용할 수 있는 방법들이 떠올랐다.
개인적으로 프로젝트를 만들 때 다양하게 접목해서 사용해보고 싶은 기능이다.
'스터디' 카테고리의 다른 글
프로그래머스 데브코스 TIL - Day 27 / Drag&Drop (0) | 2022.04.27 |
---|---|
프로그래머스 데브코스 TIL - Day 26 / 고양이 사진 검색기 (0) | 2022.04.23 |
프로그래머스 데브코스 TIL - Day 24 / SPA 배포 (0) | 2022.04.21 |
프로그래머스 데브코스 TIL - Day 23 / 과제 제출 및 회고 (0) | 2022.04.21 |
프로그래머스 데브코스 TIL - Day 22 (0) | 2022.04.20 |