我正在尝试使用 vanilla javascript 并使用 React 来学习无限滚动的教程。为了更好地理解 React 的工作原理。我可以获取数据显示初始数据。滚动到底部获取更多数据,但数据刚刚超过当前数据。另外,我最多只能获取第 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;
最佳答案
我立即注意到的一件事是 page
未处于该状态,因此它将在每次渲染时重置。另外,由于 limit
没有改变,因此您应该使用常量。
为什么要将其初始化为一个包含空对象的数组? useState([{}]);
只需使用空数组
另外,我不确定您打算在这里做什么 setPosts([{ ...posts }], posts);
但如果您想在复制对象时附加新帖子你应该这样做
const getPosts = async () => {
setIsFetching(true)
const response = await fetch(
`https://jsonplaceholder.typicode.com/posts?_limit=${limit}&_page=${page}`
);
const data = await response.json();
setPosts([...posts, ...data]);
setIsFetching(false)
};
function getMorePosts() {
setTimeout(() => {
setPage(page++)
getPosts();
}, 2000);
}
关于javascript - 使用 React 和 api 调用更新状态的无限滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60130434/