Implementando um scroll infinito em ReactJS
마지막 단계는 가장 기본적인 목표를 달성하기 위해 무한 스크롤을 구매자에게 제출하여 játenha도서관이 실시하도록 하는 것이다.Porém me perguntei:Porque não?이것은 일종의 기능적인 도구입니까?에쿠에스토 호텔😁.
머리말
무한히 긴 두루마리는 기능적인 두루마리로 경험이 풍부한 두루마리다.두루마리는 마지막 종이를 굴려 다음 종이의 즐거움과 요구를 자동으로 기록한 뒤 종이에 다음 글을 쓴 뒤 종이에 다음 글을 쓰고 마지막으로 종이에 다음 글을 쓴다.새로운 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드, 요소는 백엔드.
파지나 사노(paginaço)를 대체하는 방법은 전단이 후단까지 정확하게 갈 수 있는 것이 하나도 없고, 구매자는 파리협정의 증량에 따라 구매할 수 있다는 것이다.
Nós conseguimos ver o uso desta estratégia em sites agrupadores de Promotoção como Promobit e Opa!Ganhei.이것은 사회의 중요한 구성 부분이다.
IntersectionObserver API
실현 기능의 일부분은 API nativa do 브라우저의 일부분으로 스크롤 화면을 보조적으로 감시하고 상호작용 관찰 서버에 표시할 수 있다.또 다른 선택은 수출입 요소(시구)에서 수입과 수출 요소가 있고 수출 요소에서 수입과 수출 요소가 다르다는 것이다.
이것은 MDN을 참고할 수 있는 아주 좋은 해결 방안이다.
오코디고.👨💻🚀
NLW 05에서 프로젝트의 실용성과 기능성.
한 문장에서 그는 다른 리듬으로 자신의 이야기를 했지만 어떤 항목도 없었다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{allEpisodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
</section>
</div>
)
}
export const getStaticProps: GetStaticProps = async () => {
const { data } = await api.get('episodes', {
params: {
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
{...}
return {
props: {
allEpisodes,
latestEpisodes,
}
}
};
다음 프로젝트에서 우리는 버스 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대가 필요하다.그것은 무한권축의 실현자이며, 정확히 말하면, 그것은 위대한 창조자가 아니다.
조사 파라미터 _page=1
은 가장 기본적인 원칙이다.
const { data } = await api.get('episodes', {
params: {
_page: 1,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
아그라 데트로 데트로 데 파지나(Agora dentro do Component da página), 아마제나(precisamos armazenar)는 파지나(página)의 차세대를 위한 새로운 의료 서비스를 제공하는 다양한 회사다.이것은 위대한 나라입니다. 그것은 위대한 나라입니다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
{...}
}
O부서별 관찰자는 관찰구역 내의 모든 검측 부품을 정확하게 모니터링한다.마지막 팟캐스트 목록은 HTML의 기본 요소로 우리가 관찰한 최신 팟캐스트 목록이다.
const loadMoreRef = useRef(null);
//NO FINAL DA LISTA DE PODCASTS
<p ref={loadMoreRef}>Carregando mais episodios...</p>
A ideia então é: Sempre que o elemento com a referência loadMoreRef estiver visível precisamos buscar mais episódios, quando não estiver, o usuário não chegou ao final da listagem, portanto nada será feito.
Sintaxe do IntersectionObserver
sintaxe do IntersectionObserveréA seguinte:
let observer = new IntersectionObserver(callback, options);
관찰자 seránecessário passar 및 Constructor uma fun callback e alguns par –metros de configura ão.
옵서버 선언
배치에 있어서 우리는 하나의 완전한 묘사를 통해 관찰 요소의 기본 개념을 묘사해야 한다.Isso quer dizer que, nosso Examplo, somente quando nosso elemento HTML allEpisodes
은 exibido 100%에 흥미로운 리셋을 제공합니다.
관찰자는 파사르노의 관찰자는 관찰자이고 관찰자라고 성명했다.
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
Funço 콜백
Na função callback recebemos como par–metro todos os elementos observados em formato de array mas como nós sóestamos observando um elemento atribuímos o primeiro campo do array ao target.
덴트로가 정한 목표는 브로커의 과도기와 브로커의 권리를 관찰한 토대에서 브로커의 권리를 적절하게 심사하는 것이다. 이것은 자연자원 보호와 대중교통 안전에 관한 협의이다.
Nessa parte, eu achei melhor fazer a requisição em outro useEffects sempre que o valor da página sofrer alteração.
useEffect(() => {
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
console.log("Os episodios acabaram");
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
O는 새로운 환경에서 서로 다른 환경에서 존재하는 새로운 환경을 사용한다.
Com isso temos um scroll infinito FunctionAndo🚀! 당신은 종합적인 건축 회사입니다. 그것은 오하다라는 건축 회사입니다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
const [hasEndingPosts, setHasEndingPosts] = useState(false);
const loaderRef = useRef(null);
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
useEffect(() =>
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
setHasEndingPosts(true);
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{episodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
<p ref={loaderRef}>Carregando mais episodios...</p>
</section>
</div>
)
}
Éisso ae!😁 Vimos como implementar um scroll infinito simples que quase sempre optamos por utilizar uma lib que jáimplemente isso para gente😂😂.
이것은 기능성 건축의 종합적인 건축으로 그의 기능성 건축은 매우 중요한 구성 부분이다🖖🤘. 담수 계곡은 콘스탄트 평원이자 늪지대이다.이것은 사람을 흥분시키는 순간이다. 그것은 사람을 흥분시키는 순간이다.
곧 당신을 만날 것을 기대합니다!
가르쳐 주십시오!
실현 기능의 일부분은 API nativa do 브라우저의 일부분으로 스크롤 화면을 보조적으로 감시하고 상호작용 관찰 서버에 표시할 수 있다.또 다른 선택은 수출입 요소(시구)에서 수입과 수출 요소가 있고 수출 요소에서 수입과 수출 요소가 다르다는 것이다.
이것은 MDN을 참고할 수 있는 아주 좋은 해결 방안이다.
오코디고.👨💻🚀
NLW 05에서 프로젝트의 실용성과 기능성.
한 문장에서 그는 다른 리듬으로 자신의 이야기를 했지만 어떤 항목도 없었다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{allEpisodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
</section>
</div>
)
}
export const getStaticProps: GetStaticProps = async () => {
const { data } = await api.get('episodes', {
params: {
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
{...}
return {
props: {
allEpisodes,
latestEpisodes,
}
}
};
다음 프로젝트에서 우리는 버스 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대, 트럭 한 대가 필요하다.그것은 무한권축의 실현자이며, 정확히 말하면, 그것은 위대한 창조자가 아니다.
조사 파라미터 _page=1
은 가장 기본적인 원칙이다.
const { data } = await api.get('episodes', {
params: {
_page: 1,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
아그라 데트로 데트로 데 파지나(Agora dentro do Component da página), 아마제나(precisamos armazenar)는 파지나(página)의 차세대를 위한 새로운 의료 서비스를 제공하는 다양한 회사다.이것은 위대한 나라입니다. 그것은 위대한 나라입니다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
{...}
}
O부서별 관찰자는 관찰구역 내의 모든 검측 부품을 정확하게 모니터링한다.마지막 팟캐스트 목록은 HTML의 기본 요소로 우리가 관찰한 최신 팟캐스트 목록이다.
const loadMoreRef = useRef(null);
//NO FINAL DA LISTA DE PODCASTS
<p ref={loadMoreRef}>Carregando mais episodios...</p>
A ideia então é: Sempre que o elemento com a referência loadMoreRef estiver visível precisamos buscar mais episódios, quando não estiver, o usuário não chegou ao final da listagem, portanto nada será feito.
Sintaxe do IntersectionObserver
sintaxe do IntersectionObserveréA seguinte:
let observer = new IntersectionObserver(callback, options);
관찰자 seránecessário passar 및 Constructor uma fun callback e alguns par –metros de configura ão.
옵서버 선언
배치에 있어서 우리는 하나의 완전한 묘사를 통해 관찰 요소의 기본 개념을 묘사해야 한다.Isso quer dizer que, nosso Examplo, somente quando nosso elemento HTML allEpisodes
은 exibido 100%에 흥미로운 리셋을 제공합니다.
관찰자는 파사르노의 관찰자는 관찰자이고 관찰자라고 성명했다.
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
Funço 콜백
Na função callback recebemos como par–metro todos os elementos observados em formato de array mas como nós sóestamos observando um elemento atribuímos o primeiro campo do array ao target.
덴트로가 정한 목표는 브로커의 과도기와 브로커의 권리를 관찰한 토대에서 브로커의 권리를 적절하게 심사하는 것이다. 이것은 자연자원 보호와 대중교통 안전에 관한 협의이다.
Nessa parte, eu achei melhor fazer a requisição em outro useEffects sempre que o valor da página sofrer alteração.
useEffect(() => {
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
console.log("Os episodios acabaram");
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
O는 새로운 환경에서 서로 다른 환경에서 존재하는 새로운 환경을 사용한다.
Com isso temos um scroll infinito FunctionAndo🚀! 당신은 종합적인 건축 회사입니다. 그것은 오하다라는 건축 회사입니다.
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
const [hasEndingPosts, setHasEndingPosts] = useState(false);
const loaderRef = useRef(null);
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
useEffect(() =>
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
setHasEndingPosts(true);
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{episodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
<p ref={loaderRef}>Carregando mais episodios...</p>
</section>
</div>
)
}
Éisso ae!😁 Vimos como implementar um scroll infinito simples que quase sempre optamos por utilizar uma lib que jáimplemente isso para gente😂😂.
이것은 기능성 건축의 종합적인 건축으로 그의 기능성 건축은 매우 중요한 구성 부분이다🖖🤘. 담수 계곡은 콘스탄트 평원이자 늪지대이다.이것은 사람을 흥분시키는 순간이다. 그것은 사람을 흥분시키는 순간이다.
곧 당신을 만날 것을 기대합니다!
가르쳐 주십시오!
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{allEpisodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
</section>
</div>
)
}
export const getStaticProps: GetStaticProps = async () => {
const { data } = await api.get('episodes', {
params: {
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
{...}
return {
props: {
allEpisodes,
latestEpisodes,
}
}
};
const { data } = await api.get('episodes', {
params: {
_page: 1,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
{...}
}
const loadMoreRef = useRef(null);
//NO FINAL DA LISTA DE PODCASTS
<p ref={loadMoreRef}>Carregando mais episodios...</p>
A ideia então é: Sempre que o elemento com a referência loadMoreRef estiver visível precisamos buscar mais episódios, quando não estiver, o usuário não chegou ao final da listagem, portanto nada será feito.
let observer = new IntersectionObserver(callback, options);
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
Nessa parte, eu achei melhor fazer a requisição em outro useEffects sempre que o valor da página sofrer alteração.
useEffect(() => {
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
console.log("Os episodios acabaram");
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
export default function Home({ allEpisodes, latestEpisodes }: IHome) {
const [episodes, setEpisodes] = useState(allEpisodes);
const [currentPage, setCurrentPage] = useState(2);
const [hasEndingPosts, setHasEndingPosts] = useState(false);
const loaderRef = useRef(null);
useEffect(() => {
const options = {
root: null,
rootMargin: "20px",
threshold: 1.0
};
const observer = new IntersectionObserver((entities) => {
const target = entities[0];
if (target.isIntersecting){
setCurrentPage(old => old + 1);
}
}, options);
if (loaderRef.current){
observer.observe(loaderRef.current);
}
}, []);
useEffect(() =>
const handleResquest = async () => {
const { data } = await api.get('episodes', {
params: {
_page: currentPage,
_limit: 3,
_sort:"published_at",
_order: "desc"
}
});
if (!data.length){
setHasEndingPosts(true);
return;
}
setEpisodes([...episodes, ...data]);
}
handleResquest();
}, [currentPage]);
return (
<div className={styles.homepage}>
<section className={styles.allEpisodes} >
{...}
<tbody>
{episodes.map(episode => (
<tr key={episode.id}>
<td style={{width: 72}}>
<Image width={120} height={120} src={episode.thumbnail} alt={episode.title} objectFit="cover"/>
</td>
<td>
<Link href={`/episodes/${episode.id}`}>
<a>{episode.title}</a>
</Link>
</td>
<td>{episode.members}</td>
<td style={{width: 100}}>{episode.publishedAt}</td>
<td>{episode.durationAsString}</td>
<td>
<button type="button">
<img src="/play-green.svg" alt="Tocar episódio"/>
</button>
</td>
</tr>
))}
</tbody>
</table>
<p ref={loaderRef}>Carregando mais episodios...</p>
</section>
</div>
)
}
Reference
이 문제에 관하여(Implementando um scroll infinito em ReactJS), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/guiselair/implementando-um-scroll-infinito-95b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)