React 및 JavaScript의 미래형 무한 스크롤링
18265 단어 javascriptinfinitereactintersection
Intersection Observer API는 대상 요소와 상위 요소 또는 최상위 문서의 뷰포트와 교차하는 변경 사항을 비동기식으로 관찰하는 방법을 제공합니다.
소스 코드는 https://github.com/dhairyanadapara/infinite-scoller-example에서 사용할 수 있습니다.
데모 링크: https://dhairyanadapara.github.io/infinite-scoller-example/
솔루션부터 시작하겠습니다.
import React, { Component } from "react";
import "./App.css";
class App extends Component {
constructor(props) {
super(props);
this.state = {
arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
};
}
componentDidMount() {
this.createObserver();
}
createObserver = () => {
let options = {
root: null,
rootMargin: " 40px",
threshold: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
};
const boxElement = document.getElementById("loading");
const observer = new IntersectionObserver(
this.handleIntersect,
options
);
observer.observe(boxElement);
};
handleIntersect = (entries, observer) => {
const { arr } = this.state;
entries.forEach((entry) => {
console.log(entry.intersectionRatio);
if (entry.intersectionRatio > 0) {
this.setState({
arr: arr.concat([
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
]),
});
}
});
};
render() {
const { arr } = this.state;
return (
<div className="App" id="app">
<div id="infinite-container">
<div class="cards-list" id="card-list">
{arr.map((x) => (
<div class="card 1">
<div class="card_image">
{" "}
<img src="https://i.redd.it/b3esnz5ra34y.jpg" />
</div>
<div class="card_title title-white">
<p>Card Title</p>
</div>
</div>
))}
</div>
<div id="loading" style={{ height: "100px" }}>
Loading
</div>
</div>
</div>
);
}
}
export default App;
보시다시피 우리는 반응 클래스 구성 요소를 사용하여 이해하기 쉽습니다. 기능적 구성 요소를 사용할 수도 있습니다.
옵저버 초기화에 대한 이해부터 시작하겠습니다.
createObserver = () => {
let options = {
root: null,
rootMargin: " 40px",
threshold: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
};
const boxElement = document.getElementById("loading");
const observer = new IntersectionObserver(this.handleIntersect, options);
observer.observe(boxElement);
};
IntersectionObserver
는 2개의 인수를 사용합니다.옵션
옵션은 Intersection Observer의 구성입니다. 3가지 속성이 있습니다.
뿌리:
뷰포트로 사용하려는 요소입니다. 브라우저의 뷰포트 패스
null
를 사용하려는 경우 . 루트마진 :
교차점을 계산하는 동안 대상 사각형에 오프셋이 추가됨
한계점:
증가하는 숫자 순서로 정렬된 임계값 목록입니다.
intersectionRatio
임계값콜백
콜백에는 2개의 인수가 있습니다.
항목
대상과 루트 요소 간의 교차를 설명하는 IntersectionObserverEntry 목록
관찰자
CreateObserver에서 생성한 것과 동일한 IntersectionObserver 객체
여기서 우리는 카드 목록의 맨 아래에 있을 로딩 요소를 관찰하고 있습니다. 우리의 경우 관찰자에 대상 요소가 1개뿐이므로 항목에서 1개의 객체만 얻습니다. 동일한 관찰자를 대상으로 하는 대상 요소가 여러 개인 경우 더 많은 항목을 얻게 됩니다.
handleIntersect = (entries, observer) => {
const { arr } = this.state;
entries.forEach((entry) => {
if (entry.intersectionRatio > 0) {
this.setState({
arr: arr.concat([
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
]),
});
}
});
};
IntersectionObserverEntry 객체는
boundingClientRect
, intersectionRatio
, intersectionRect
, isIntersecting
, rootBounds
, target
,time
.주요 속성은 다음과 같습니다.
위의 함수에서 항목을 반복하고 교차 비율이 0보다 큰지 확인했습니다. 이는 대상 요소에 루트 또는 뷰포트와의 교차가 발생했는지 여부를 의미하지 않습니다. 보시다시피 card-list 요소의 맨 아래에 있는 id
loading
의 요소를 관찰하고 있습니다. 따라서 아래로 스크롤하여 로딩 요소에 도달하면 교차가 발생하고 그에 따라 상태가 업데이트됩니다.이 경우 데이터가 빠르게 업데이트되므로 API 호출을 수행하지 않습니다. fetch 요청의 경우
rootMargin
를 사용하는 것이 좋습니다. 요구 사항에 따라 임계값을 업데이트할 수도 있습니다.
Reference
이 문제에 관하여(React 및 JavaScript의 미래형 무한 스크롤링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dhairyanadapara/infinite-scrolling-react-45pg텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)