Я пытаюсь взять урок для бесконечного свитка с использованием ванили javascript и использую реагирование. Чтобы лучше понять, как работает реакция. Я могу получить данные отображения начальных данных. Прокрутите до нижней части, чтобы получить больше данных, но данные только по текущим данным. Также я могу получить только до страницы 2, я был бы рад, если бы кто-то мог указать мне правильное направление.
import React, { useState, useEffect } from "react";
import "./App.css";
function App() {
const [posts, setPosts] = useState([{}]);
const [isFetching, setIsFetching] = useState(false);
let limit = 5;
let page = 1;
const getPosts = async () => {
const response = await fetch(
`https://jsonplaceholder.typicode.com/posts?_limit=${limit}&_page=${page}`
);
const data = await response.json();
setPosts(data);
console.log(data);
};
function handleScroll() {
if (
window.innerHeight + document.documentElement.scrollTop !==
document.documentElement.offsetHeight
)
return;
setIsFetching(true);
}
function getMorePosts() {
setTimeout(() => {
page++;
setPosts([{ ...posts }], posts);
setIsFetching(false);
}, 2000);
}
useEffect(() => {
window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
}, []);
useEffect(
() => {
getPosts();
}, //eslint-disable-next-line
[]
);
useEffect(() => {
if (!isFetching) return;
getMorePosts();
}, [isFetching]);
return (
<div className="App">
{posts.map((post, index) => (
<div key={index} className="post">
<div className="number">{post.id}</div>
<div className="post-info">
<h2 className="post-title">{post.title}</h2>
<p className="post-body">{post.body}</p>
</div>
</div>
))}
{isFetching && (
<div className="loader">
<div className="circle"></div>
<div className="circle"></div>
<div className="circle"></div>
</div>
)}
</div>
);
}
export default App;