如何在REACT INFINITE中为每个页面仅发出一次API请求,请滚动此处

用户名

我正在开发一个React无限滚动组件,它的工作原理完美而完美,只有一个小问题是,对于第1页,它发出了两倍的API请求,而我不希望这样做;对于其他第2、3、4页它仅发出一次请求。

我尝试了所有操作,但无法修改代码,因此对于第1页,它仅发出一次请求。

我也只能一次发出第1页的请求吗?这是工作代码。

import React, { useState, useEffect } from "react";
import axios from "axios";

function Lists() {
  const [posts, setPosts] = useState([]);
  const [newposts, setNewposts] = useState([]);
  const [isFetching, setIsFetching] = useState(false);
  const [page, setPage] = useState(1);
  const LIMIT = 7;

  const getPosts = () => {
    axios.get(`https://jsonplaceholder.typicode.com/posts?_limit=${LIMIT}&_page=${page}`)
      .then(res => {
        setNewposts(res.data);
        setPosts([...posts, ...res.data]);
        setIsFetching(false);
      })
  };

  const getMorePosts= () => {
      setPage(page + 1);
      getPosts();
  }

  const handleScroll = () => {
    if (
      window.innerHeight + document.documentElement.scrollTop  !==
      document.documentElement.offsetHeight
    ) return;
    setIsFetching(true);
  }

  useEffect(() => {
    window.addEventListener("scroll", handleScroll);
    return () => window.removeEventListener("scroll", handleScroll);
  }, []);

  useEffect(() => {
      getPosts();
    },[]);

  useEffect(() => {
    if (!isFetching){
      return;
    }
    if( newposts.length > 0 ){
        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 && newposts.length > 0 && (
        <div style = {{display: "flex", justifyContent:"center"}}>
        <div className="spinner-border" role="status">
            <span className="sr-only">Loading...</span>
        </div>
        </div>
      )}
    </div>
  );
 }

export default Lists;


达夫尼克维尔

问题是setPage,就像任何状态设置程序一样,它是异步工​​作的-它不会page立即更新您可能期望的值的值page将仅在状态更改触发的后续渲染中更新。

这意味着在getMorePosts()你并没有得到真正的page + 1收获page

在第一次这意味着使你打电话getPosts()的,其他useEffect,与page设置为1,然后再调用它,当你滚动和呼叫getPosts()内部getMorePosts()通话。

后续调用仅发生一次,因为每个后续渲染中的getMorePosts()增量page

至于修复,一个快速的方法可能只是page作为一个arg getPosts,然后您可以静态地getPosts(1)在第一个render上调用,并使其余逻辑保持不变,但将page状态初始化为2并将调用更改为getPage(page)inside getMorePosts()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在React中自动发出API请求?

来自分类Dev

如何在React Native中显示一次屏幕?

来自分类Dev

如何在 React 中发出 AJAX 请求?

来自分类Dev

如何创建仅发出一次HTTP请求的angular js服务

来自分类Dev

如何只在React中一次请求API数据,而不是每次访问都呈现页面?

来自分类Dev

用于ContextRefreshEvent的Spring ApplicationListener。如何在每个层次结构中仅调用一次?

来自分类Dev

如何在每个会话中仅显示一次警告?

来自分类Dev

如何在wp8中每个星期五仅运行一次提醒

来自分类Dev

如何在SQL中对每个UniqueId仅求和一次?

来自分类Dev

如何在 React 中点击按钮发出 API 请求

来自分类Dev

如何在ASP.NET MVC中仅显示一次页面

来自分类Dev

如何在Java中仅设置一次变量

来自分类Dev

如何在Python中仅运行一次算法

来自分类Dev

如何在文件中仅写入一次增量?

来自分类Dev

如何在CoffeeScript中仅执行一次功能

来自分类Dev

如何在jQuery中仅显示一次警报

来自分类Dev

我如何在React应用程序中向API发出一百万个以上的请求?

来自分类Dev

如何在React中为列表建模

来自分类常见问题

如何在React中隐藏API密钥?

来自分类Dev

如何在React中获取API响应?

来自分类Dev

如何在 React 中过滤 api 数据

来自分类Dev

如何将gpg配置为每个会话仅输入一次密码

来自分类Dev

如何在Wordpress页面上渲染React?

来自分类Dev

React:如何在同一页面中两次使用相同的组件,但只为一次加载一个脚本标签

来自分类Dev

如何在 React 中跨组件处理一次性事件?

来自分类Dev

如何仅一次在列中显示每个日期(就像Tableau一样)?

来自分类Dev

如何在React Native中优化图像

来自分类Dev

如何在React中的循环内触发'this'

来自分类Dev

如何在React组件中访问JSON?

Related 相关文章

  1. 1

    如何在React中自动发出API请求?

  2. 2

    如何在React Native中显示一次屏幕?

  3. 3

    如何在 React 中发出 AJAX 请求?

  4. 4

    如何创建仅发出一次HTTP请求的angular js服务

  5. 5

    如何只在React中一次请求API数据,而不是每次访问都呈现页面?

  6. 6

    用于ContextRefreshEvent的Spring ApplicationListener。如何在每个层次结构中仅调用一次?

  7. 7

    如何在每个会话中仅显示一次警告?

  8. 8

    如何在wp8中每个星期五仅运行一次提醒

  9. 9

    如何在SQL中对每个UniqueId仅求和一次?

  10. 10

    如何在 React 中点击按钮发出 API 请求

  11. 11

    如何在ASP.NET MVC中仅显示一次页面

  12. 12

    如何在Java中仅设置一次变量

  13. 13

    如何在Python中仅运行一次算法

  14. 14

    如何在文件中仅写入一次增量?

  15. 15

    如何在CoffeeScript中仅执行一次功能

  16. 16

    如何在jQuery中仅显示一次警报

  17. 17

    我如何在React应用程序中向API发出一百万个以上的请求?

  18. 18

    如何在React中为列表建模

  19. 19

    如何在React中隐藏API密钥?

  20. 20

    如何在React中获取API响应?

  21. 21

    如何在 React 中过滤 api 数据

  22. 22

    如何将gpg配置为每个会话仅输入一次密码

  23. 23

    如何在Wordpress页面上渲染React?

  24. 24

    React:如何在同一页面中两次使用相同的组件,但只为一次加载一个脚本标签

  25. 25

    如何在 React 中跨组件处理一次性事件?

  26. 26

    如何仅一次在列中显示每个日期(就像Tableau一样)?

  27. 27

    如何在React Native中优化图像

  28. 28

    如何在React中的循环内触发'this'

  29. 29

    如何在React组件中访问JSON?

热门标签

归档