【问题标题】:How to implement infinite scroll in next js?如何在下一个js中实现无限滚动?
【发布时间】:2021-05-20 16:40:09
【问题描述】:

next js 中的无限滚动不工作,相同的代码在正常create-react-app 上工作

【问题讨论】:

    标签: pagination next.js lazy-loading infinite-scroll react-infinite-scroll-component


    【解决方案1】:

    与普通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,我们正在接收该道具并将其传递给组件。 如果您仔细观察,我们将初始渲染限制为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

    【讨论】:

    • 所以我们放弃了预渲染页面,对吧?或者我们如何实现一个页面,比如预渲染 10 个帖子,其余的将来自getMorePost()
    • 现在我们正在做客户端无限滚动?这不会在客户端显示 API url 吗?
    • @JatinHemnan 您可以为它创建一个 api 路由并从您的 api 调用它,不是吗?
    • @Syph 你的意思是像 /api/something 是的,可以工作
    猜你喜欢
    • 2020-11-09
    • 2017-08-29
    • 2019-09-23
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多