【问题标题】:Static pagination in NextJSNextJS 中的静态分页
【发布时间】:2020-06-28 22:01:20
【问题描述】:

我正在尝试在 Next JS 中设置分页,但我无法弄清楚如何通过 getStaticProps 实现这一点。我可以通过带有查询参数的 getServerSideProps 来做到这一点,但这不能通过 getStaticProps 访问。数据来自本地 Strapi 后端。

这是 getServerSideProps 的示例(有效):

export async function getServerSideProps({ query: { page = 1 } }) {
const { API_URL } = process.env;

const start = +page === 1 ? 0 : (+page - 1) * 3;
const numberOfCakesRes = await fetch(`${API_URL}/cakes/count`);
const numberofCakes = await numberOfCakesRes.json();

const res = await fetch(`${API_URL}/cakes?_limit=3&_start=${start}`);
const data = await res.json();

return {
    props: {
        cakes: data,
        page: +page,
        numberofCakes,
    },
};

}

然后我只需将按钮连接到路由器即可来回移动。

onClick={() => router.push(`/?page=${page - 1}`)}

我需要访问类似于 getServerSideProps 中的查询参数的内容。 我的要求是静态实现的吗?

【问题讨论】:

    标签: javascript next.js


    【解决方案1】:

    因为getStaticProps 在构建时运行,所以它不接收数据 仅在请求期间可用,例如查询参数 或 HTTP 标头,因为它生成静态 HTML。 docs

    您可以做的一件事是不要将页码放在查询中,而是将其作为路由参数,即用户将访问/3 而不是/?page=3

    要实现它,需要在pages目录下创建一个[page].js,并导出一个getStaticPaths函数:

    export async function getStaticPaths() {
      // query Strapi to calculate the total page number
      return {
        paths: [
          { params: { page: '1' } },
          { params: { page: '2' } },
          { params: { page: '3' } }
        ],
        fallback: true or false // See the "fallback" section in docs
      };
    }
    

    还有一个getStaticProps函数:

    export async function getStaticProps(context) {
      const { page } = context.params;
      // fetch page data 
      return {
        props: { ... }, 
      }
    }
    

    在 Next.js docs 中了解有关 getStaticPathsgetStaticProps 的更多信息。

    【讨论】:

    • 是否存在一种比另一种更具有优势的情况?
    • 但是如果我们不知道构建时会有多少页面,我们该怎么办?如果有大量页面,我们当然不应该枚举我们的路径
    • @x86-64 然后你可以使用incremental static generation
    • @x86-64 as @shivam-jha 提到您可以使用 ISG 并在访问这些页面时构建这些页面(使用首选的fallback 设置),或者如果您真的想要预构建这些是静态的,在getStaticPaths 内部,您可以动态获取您的内容并确定需要多少页以及分页限制和当前条目数,然后返回所有必要/可能页面的构建路径(/cakes/1/cakes/2/cakes/3 等),但是如果您的内容需要数十/数百页,您可能不希望通过带有 blocking 选项的简单 ISR 来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 2023-03-07
    • 2021-11-10
    • 1970-01-01
    • 2021-08-11
    • 2020-02-16
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多