무한 스크롤이 등장한 지 꽤 되었습니다. 기본 아이디어: 스크롤할 때 새로운 콘텐츠가 맨 아래에 로드되어 끝없는 스크롤이 생성됩니다. 이를 구현하는 것은 간단하지만 신중한 계획이 없으면 성능이 저하됩니다. 몇 번의 콘텐츠 다시 가져오기 후에는 수백 개의 DOM 요소가 있을 수 있지만 그 중 상당수는 보이지 않습니다. 다행히도 이를 완화할 수 있는 패턴이 있으며 Angular를 사용하여 패턴을 살펴보겠습니다.
우리가 피하고 싶은 것은 바로 이것이다.
가상 스크롤
가상 스크롤은 언제든지 큰 목록의 하위 집합만 렌더링합니다. 이는 무한 스크롤과 다릅니다. 모든 것을 한 번에 렌더링하는 것이 비효율적인 대규모 데이터 세트에 이상적입니다. 보이는(및 거의 보이는) 항목만 렌더링됩니다. 사용자가 스크롤하면 항목이 동적으로 교체됩니다. 이는 DOM 요소를 크게 줄여 성능을 향상시킵니다.
가상 스크롤은 뷰포트 높이와 일치하는 컨테이너를 생성하여 작동합니다. CSS를 통해 관리되는 특정 스크롤 깊이에서 표시되는 항목(버퍼 포함)만 이 컨테이너 내에서 렌더링됩니다. 스크롤하면 컨테이너가 업데이트되어 새 항목이 표시되고 보기에서 제거되고 스크롤 깊이가 조정됩니다. 이를 무한 스크롤과 결합하면 성능 저하 없이 사실상 무한 목록이 생성됩니다.
아래 예에서는 수천 개의 항목 목록을 표시하지만 한 번에 최대 8개를 렌더링합니다. 스크롤하면 CSS 스크롤 높이가 조정되어 훨씬 긴 목록처럼 보입니다.
실제 사례
Reddit의 페이지 매김 API에서 미디어를 가져와 가상 스크롤 목록에 표시하는 Angular 애플리케이션을 구축해 보겠습니다. 하위 레딧 선택을 위한 검색창과 필터가 포함됩니다. 아래로 스크롤하면 더 많은 콘텐츠가 로드됩니다. 우리의 주요 요구 사항:
- RxJS Observable과 비동기 파이프를 기반으로 합니다.
- 하위 레딧이나 필터 변경 시 콘텐츠를 재설정하지만 새 콘텐츠를 추가할 때는 재설정하지 않습니다.
- 중복 API 호출 없이 원활한 위/아래 스크롤을 위해 이전 콘텐츠를 메모리에 저장합니다.
@angular/cdk
패키지(Virtual Scroller 구성요소 포함)를 사용하겠습니다. npm i @angular/cdk
으로 설치하세요.
이 예시에서는 Angular를 사용하지만 비슷한 패턴을 React, Vue 또는 바닐라 JavaScript에 적용할 수 있습니다. 기본 원칙을 설명하는 기본 데모는 여기에서 볼 수 있습니다.
서비스 설정
먼저 Angular의 HttpClient
및 RxJS Observable을 사용하여 Reddit API에서 콘텐츠를 가져오는 서비스를 만들어 하위 레딧 이름과 필터를 관리합니다. (간결함을 위해 일부 코드는 생략되었습니다. 전체 구현은 여기에 있습니다).
// ... (Omitted for brevity) ...
콘텐츠 가져오기 방법은 데이터 요청 중에 특정 속성을 추적합니다. 마지막 항목 다음에 새 콘텐츠를 가져오도록 page
속성이 쿼리 문자열에 추가됩니다. 또한 게시물 힌트가 없는 NSFW 콘텐츠와 항목을 필터링합니다. 이렇게 하면 예상되는 콘텐츠만 표시됩니다.
// ... (Omitted for brevity) ...
query$
관찰 가능(이전에 생략됨)은 콘텐츠를 가져오기 전에 서로 다른 관찰 가능 스트림을 병합합니다. scan
연산자는 이전 및 현재 스트림 결과를 결합하여 여러 페이지에 걸쳐 대규모 데이터 배열을 구축합니다.
이를 통해 광범위한 스크롤이 가능합니다. 하위 레딧 이름이나 필터 변경만 전체 다시 가져오기를 트리거합니다. nextPage
의 속성인 query$
은 현재 세트의 마지막 항목 ID를 저장하며, 가상 스크롤러의 하단에 가까워졌을 때 다음에 가져올 페이지를 결정하는 데 사용됩니다.
// ... (Omitted for brevity) ...
RxJS의 힘은 데이터 스트림을 결합하고 조작하는 데 있습니다. 이를 통해 비즈니스 로직이 구성 요소에 도달하기 전에 처리하여 구성 요소를 더 깔끔하고 재사용 가능하게 유지할 수 있습니다.
구성요소 설정
다음으로 Angular의 CdkVirtualScrollViewport
을 사용하여 콘텐츠를 표시하는 컴포넌트를 설정했습니다. 메소드는 뷰포트 하단 근처의 스크롤을 처리하고 subRedditPage$
Observable
// ... (Omitted for brevity) ...
템플릿은 비동기 파이프를 사용하여 query$
을 구독합니다. 참고: 가상 스크롤러는 가변 높이 콘텐츠로 인해 더욱 복잡해집니다. 성능을 위해서는 일관된 항목 높이를 권장합니다.
// ... (Omitted for brevity) ...
onScroll
메소드는 사용자가 하단에 가까워지면 더 많은 콘텐츠를 가져옵니다. nextPage
ID(query$
에서)를 사용하여 subRedditPage$
로 내보내고 다음 API 호출을 트리거하고 query$
을 통해 목록을 업데이트합니다.
// ... (Omitted for brevity) ...
검색창과 탭 컨트롤도 통합되었습니다(아래의 간단한 예).
// ... (Omitted for brevity) ...
결론
이렇게 하면 사실상 무한한 스크롤러가 생성됩니다. 여기에서 테스트해 볼 수 있습니다. Reddit의 API에는 속도 제한이 있습니다. 테스트 중에 충돌할 수도 있습니다. 추가 기능을 포함한 자세한 내용은 여기에서 GitHub 저장소를 참조하세요.
위 내용은 Angular를 사용한 사실상 무한 스크롤의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

CSS 그리드는 복잡하고 반응이 좋은 웹 레이아웃을 만드는 강력한 도구입니다. 디자인을 단순화하고 접근성을 향상 시키며 이전 방법보다 더 많은 제어를 제공합니다.

기사는 반응 형 설계에서 공간의 효율적인 정렬 및 분포를위한 레이아웃 방법 인 CSS Flexbox에 대해 설명합니다. Flexbox 사용을 설명하고 CSS 그리드와 비교하고 브라우저 지원 세부 사항을 설명합니다.

이 기사는 Viewport Meta 태그, 유연한 그리드, 유체 미디어, 미디어 쿼리 및 상대 장치를 포함하여 CSS를 사용하여 반응 형 웹 사이트를 만드는 기술에 대해 설명합니다. 또한 CSS 그리드 및 Flexbox를 함께 사용하여 CSS 프레임 워크를 권장합니다.

이 기사는 요소 치수 계산 방법을 제어하는 CSS 박스 크기 속성에 대해 설명합니다. Content-Box, Border-Box 및 Padding-Box와 같은 값과 레이아웃 설계 및 형태 정렬에 미치는 영향을 설명합니다.

기사는 CSS, 주요 특성 및 JavaScript와 결합 된 애니메이션 작성에 대해 논의합니다. 주요 문제는 브라우저 호환성입니다.

기사는 3D 변환, 주요 속성, 브라우저 호환성 및 웹 프로젝트에 대한 성능 고려 사항에 대한 CSS 사용에 대해 논의합니다. (문자 수 : 159)

이 기사는 CSS 그라디언트 (선형, 방사형, 반복)를 사용하여 웹 사이트 비주얼을 향상시키고 깊이, 초점 및 현대적인 미학을 추가합니다.

기사는 CSS의 의사 요소, HTML 스타일을 향상시키는 데 사용 및 의사 급의 차이점에 대해 설명합니다. 실제 사례를 제공합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

WebStorm Mac 버전
유용한 JavaScript 개발 도구

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전