【问题标题】:Dynamic nested routes in Next.jsNext.js 中的动态嵌套路由
【发布时间】:2023-03-09 19:43:01
【问题描述】:

我正在 Next.js 中构建电子商务 Web 应用程序,但遇到了产品过滤问题。假设有 3 个可能的过滤选项:

  1. 按类别 - 屈光度/太阳镜
  2. 按性别 - 男性/女性
  3. 按品牌 - rayban / gucci

现在,过滤器应该作为子页面工作。假设用户选择了男士太阳镜,那么 URL 应如下所示:/sunglasses/men。现在,我的网站上有 4 个可能的示例 URL:

  1. /墨镜/男士
  2. /太阳镜/雷朋
  3. /sunglasses/men/rayban
  4. /sunglasses/rayban/男士

我无法弄清楚路由器应该如何区分前两个 URL,并弄清楚第一个 URL 中的第二个参数是性别过滤器,但第二个 URL 中的第二个参数是品牌过滤器。

我正在使用 Next.js 及其服务器端渲染 (getServerSideProps)。

感谢您的帮助。

【问题讨论】:

  • 为什么不使用查询参数? /products?category=x&sex=y&brand=z
  • 我已经在使用查询参数并且它可以工作,但我想这样改变它

标签: javascript reactjs next.js nested-routes next-router


【解决方案1】:

如果您不想创建单独的路由,可以使用下面的 gerServerSideProps 实现

export async function gerServerSideProps({ params, ...props }) {
  const products = await fetchProducts();
  if (params.slugs && params.slugs instanceof Array) {
    if (params.slugs.length > 2) {
      const filteredProducts = products.filter(
        (p) =>
          p.category === params.slugs[0] &&
          (p.sex === params.slugs[1] || p.sex === params.slugs[2])&&
          (p.brand === params.slugs[1] || p.brand === params.slugs[2])
      );
      return {
        props: {
          products:filteredProducts
        },
      };
    } else if (params.slugs.length > 1) {
        const filteredProducts = products.filter(
            (p) =>
              p.category === params.slugs[0] &&
              (p.sex === params.slugs[1] || 
              p.brand === params.slugs[1])
          );
          return {
            props: {
              products:filteredProducts
            },
          };
      
    } else if(params.slugs.length > 0){
        const filteredProducts = products.filter(
            (p) =>
              p.category === params.slugs[0])
          return {
            props: {
              products:filteredProducts
            },
          };
  }
  else{
    return {
        props: {
          products:[]
        },
    };

}
}

【讨论】:

  • 谢谢!这似乎是我正在寻找的解决方案。我将在接下来的几天内尝试一下,如果它有效,我会告诉你。
【解决方案2】:

您可以为具有相同参数的路由创建一个单独的文件夹。

例如

1./太阳镜/男士

1./pages/sunglasses/gender/[gender].js

2./太阳镜/雷朋

2./pages/sunglasses/type/[type].js

3./sunglasses/men/rayban

3./pages/sunglasses/item/[gender]/[item].js

4./sunglasses/rayban/男士

4./pages/sunglasses/gender/[item]/[gender].js

【讨论】:

  • 是的,我也想出了这个解决方案,但在我的应用中,有数百种变化,所以解决方案必须是动态的
猜你喜欢
  • 2021-01-29
  • 2021-12-02
  • 2022-07-29
  • 2021-09-28
  • 1970-01-01
  • 2021-03-14
  • 2022-11-05
  • 2021-11-04
  • 2020-08-11
相关资源
最近更新 更多