javascript - 使用 React 和 api 调用更新状态的无限滚动

标签 javascript reactjs state react-hooks

我正在尝试使用 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/

相关文章:

javascript - React : What is the core difference between setting a state in a constructor vs. 只是设置类中的状态?

ios - applicationDidBecomeActive 根本没有被调用

javascript - 使用 Enter Key React 触发提交按钮

javascript - 错误意外标记}

javascript - 如何使用 REGEX 匹配和不匹配子字符串

django - JSON Material UI 选择下拉菜单

javascript - 为什么 JavaScript 中带小数的最大位数只有 16

reactjs - 如何从一个组件更新 Hook 并使其更新另一个组件?

javascript - 如何通过 refs 以编程方式在 React 中设置选定的值?

javascript - 使用 Context 进行 React State 过滤