You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js中实现三级分类+产品ID的动态路由?

Next.js产品层级动态路径实现方案

需求说明

需要为产品生成分类slug/子分类slug/子子分类slug/产品ID格式的动态URL,例如示例产品对应的/category-a/subcategory-a1/sub-subcategory-a1-1/123。


实现步骤

1. 编写Slug转换函数

首先需要将分类名称转换为符合URL规范的slug(小写、空格转连字符):

function slugify(text) {
  return text
    .toLowerCase()
    .replace(/\s+/g, '-')
    .replace(/[^\w\-]+/g, '')
    .replace(/\-\-+/g, '-')
    .trim();
}

2. 构建分类ID到Slug的映射表

为避免每次查找都遍历嵌套数组,提前预处理分类数据,构建ID与对应slug的映射:

// 构建子子分类映射(key: subsubcategory_id,value: 三级分类的slug集合)
const subsubcategoryMap = {};

categories.forEach(category => {
  const categorySlug = slugify(category.name);
  category.subcategories.forEach(subcategory => {
    const subcategorySlug = slugify(subcategory.name);
    subcategory.subsubcategories.forEach(subsubcategory => {
      const subsubcategorySlug = slugify(subsubcategory.name);
      subsubcategoryMap[subsubcategory.id] = {
        categorySlug,
        subcategorySlug,
        subsubcategorySlug
      };
    });
  });
});

3. 生成单个产品的完整路径

通过产品的ID字段,从映射表中获取对应slug,拼接成目标路径:

function getProductPath(product) {
  const { categorySlug, subcategorySlug, subsubcategorySlug } = subsubcategoryMap[product.subsubcategory_id];
  return `/${categorySlug}/${subcategorySlug}/${subsubcategorySlug}/${product.id}`;
}

// 示例用法
const sampleProduct = products[0];
console.log(getProductPath(sampleProduct)); // 输出: /category-a/subcategory-a1/sub-subcategory-a1-1/123

4. Next.js动态路由与静态生成配置

在pages目录下创建嵌套动态路由文件:[category]/[subcategory]/[subsubcategory]/[productId].js,实现页面的静态生成:

// pages/[category]/[subcategory]/[subsubcategory]/[productId].js
import { useRouter } from 'next/router';

export default function ProductPage({ product }) {
  const router = useRouter();
  if (router.isFallback) {
    return <div>Loading...</div>;
  }

  return (
    <div>
      <h1>{product.name}</h1>
      <p>Price: ${product.price}</p>
      <p>{product.description}</p>
    </div>
  );
}

export async function getStaticPaths() {
  // 生成所有产品的路径参数
  const paths = products.map(product => {
    const { categorySlug, subcategorySlug, subsubcategorySlug } = subsubcategoryMap[product.subsubcategory_id];
    return {
      params: {
        category: categorySlug,
        subcategory: subcategorySlug,
        subsubcategory: subsubcategorySlug,
        productId: product.id.toString()
      }
    };
  });

  return { paths, fallback: false };
}

export async function getStaticProps({ params }) {
  // 根据productId查找对应产品
  const product = products.find(p => p.id.toString() === params.productId);
  return { props: { product } };
}

内容的提问来源于stack exchange,提问作者ziyaDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:37:43