如何在下一个js中实现无限滚动?

问题描述

next js 中的无限滚动不起作用,相同的代码适用于普通 create-react-app

解决方法

与普通的 React Js 不同,NextJs 中的无限滚动有不同的方法。这里我们将使用一个名为 react-infinite-scroll-component 的 npm 包。

让我们看看 index.js 文件 index.js

import Content from "./Content";

export default function index(props) {
  return (
    <>
      <div>
        <Content data={props.data} />
      </div>
    </>
  );
}

export const getStaticProps = async () => {
  const data = await fetch(
    "https://jsonplaceholder.typicode.com/todos?_limit=10"
  ).then((response) => response.json());
  return {
    props: { data }
  };
};

在上面的代码中,您可以看到我们正在从 getStaticProps 获取数据,它返回 json data as props,并且我们正在接收该 prop 并将其传递给组件。 如果您仔细观察,我们将初始呈现限制为 10,因此,将显示前 10 个数据,然后我们将再次从服务器获取 data

现在,让我们看看内容页面 Content.js

import React,{ useState } from "react";
import InfiniteScroll from "react-infinite-scroll-component";

const Content = ({ data }) => {
  const [posts,setPosts] = useState(data);
  const [hasMore,setHasMore] = useState(true);

  const getMorePost = async () => {
    const res = await fetch(
      `https://jsonplaceholder.typicode.com/todos?_start=${posts.length}&_limit=10`
    );
    const newPosts = await res.json();
    setPosts((post) => [...post,...newPosts]);
  };

  return (
    <>
      <InfiniteScroll
        dataLength={posts.length}
        next={getMorePost}
        hasMore={hasMore}
        loader={<h3> Loading...</h3>}
        endMessage={<h4>Nothing more to show</h4>}
      >
        {posts.map((data) => (
          <div key={data.id}>
            <div className="back">
              <strong> {data.id}</strong> {data.title}
            </div>
            {data.completed}
          </div>
        ))}
      </InfiniteScroll>
      <style jsx>
        {`
          .back {
            padding: 10px;
            background-color: dodgerblue;
            color: white;
            margin: 10px;
          }
        `}
      </style>
    </>
  );
};

export default Content;

在这里,我们在所有数据加载后从服务器获得更多帖子。代码一目了然。

setPosts((post) => [...post,...newPosts]);

有了上面的状态,我们将之前的数据附加到传入的数据中

您可以检查此代码沙箱以了解其实际工作方式。

https://codesandbox.io/s/next-js-infinite-scroll-3vfem

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...