无限滚动与NextJS13服务器组件(应用程序目录)

6ss1mwsb  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(139)

目前正在尝试重构我们的项目,以使用服务器组件(应用程序目录),第一个挑战是如何实现无限滚动分页与新的“应用程序”目录。
这是一个过于简单的页面示例:

import OrganisationInterface from "@/interfaces/OrganisationInterface";

async function getData() {
  const res = await fetch('http://api.test/v1/organisations?page=1');

  if (!res.ok) {
    throw new Error('Failed to fetch data');
  }

  return res.json();
}

export default async function Page() {
  const { data } = await getData();

  return (
      <>
        <div className="mx-auto in-h-screen ">
          {data && data.map((organisation: OrganisationInterface) => (
              <div key={organisation.id}>
                {organisation.attributes.title.lt}
              </div>
          ))}
        </div>
      </>
  );
}

我在服务器上预取了10个初始结果,现在我需要向客户端请求添加另外10,20,30个......
或者我应该在服务器端以某种方式做它?我需要一些如何正确实现这一点的想法或例子,以前的解决方案是基于客户端的,使用SWR或ReactQuery。

olmpazwi

olmpazwi1#

您完全可以在服务器上使用初始批次的项目进行预呈现,然后在用户滚动页面时在客户端获取其他项目。
这里有几个想法和具体的例子。
1.在API路由下实现数据检索逻辑,并在服务器和客户端组件中从该API路由获取数据。
沙盒-https://codesandbox.io/p/sandbox/adoring-browser-vk5k0d?file=%2Fapp%2Fpage.tsx
1.将数据提取功能实现为server action(免责声明:服务器动作当前处于alpha),并将其向下传递到客户端组件。

export default async function Home() {
  async function fetchItems(page = 0) {
    "use server";
    
    return ...
  }
    
  const items = await fetchItems();
    
  return <Items initialItems={items} fetchItems={fetchItems} />;
}

沙盒-https://codesandbox.io/p/sandbox/stackoverflow-76266563-server-actions-f2gt3o?file=%2Fapp%2Fpage.tsx

相关问题