我正在尝试渲染一个无限滚动组件,并在滚动到它的末尾时用新获取的新闻更新它的数据。它在第一次滚动时工作,但在那之后卡在Loading...
。我不明白发生了什么事,使它在第一次滚动后停止获取。
应该获取新数据的代码如下所示:
const [latestNews, setLatestNews] = useState<any[]>([]);
const [page, setPage] = useState<number>(1);
const getLatestNews = async (page: number) => {
let url = `https://api.nytimes.com/svc/search/v2/articlesearch.json?api-key=${API_KEY}&page=${page}`;
const response = await fetch(url);
const data = await response.json();
setLatestNews(data.response.docs);
setPage(page + 1);
}
我的无限滚动组件看起来像这样
<InfiniteScroll dataLength={latestNews.length} next={() => getLatestNews(page)} hasMore={true} loader={<h4>Loading...</h4>} scrollableTarget="scrollableDiv">
{
latestNews.map((article, index) => (
<div className="latest-news-article flex flex-col gap-3 mb-4" key={index}>
<p className="latest-news-article-date">
{article.pub_date.slice(11, 16)}
</p>
<h1>
{article.headline.main}
</h1>
</div>
))
}
</InfiniteScroll>
2条答案
按热度按时间2jcobegt1#
我想我现在找到解决办法了。
用我的话来说,滚动速度“太快了”,它很快就更新了状态,比API接受请求的速度快得多,我得到的是
429 Too Many Requests
。解决方案:我把setTimeout增加到5000ms,这样API请求就不会立即发送,状态也会很好地改变,它也会相应地呈现新的新闻。
cclgggtu2#
你的解决方案是可行的,但还有另一个更符合逻辑的解决方案。
您可以使用useRef添加一个ref,并在发送请求时更改其值,以防止同时发送另一个请求: