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

Next.js基于本地数据实现三级嵌套动态路由的开发咨询

实现步骤

1. 调整文件结构

Next.js嵌套动态路由需要用文件夹层级来匹配路由层级,你需要把原有二级路由的单文件改成文件夹结构,调整后pages/cars目录结构如下:

pages/cars/
├── index.js # 原有第一级路由 /cars 无需修改
└── [name]/ # 新建同名文件夹,替换原来的 [name].js 单文件
    ├── index.js # 将原 [name].js 的代码移到此处,对应二级路由 /cars/[name]
    └── [modelId].js # 新建文件,对应三级路由 /cars/[name]/[modelId]

2. 修改二级路由跳转逻辑

修改pages/cars/[name]/index.js代码,给每个车型添加跳转到三级详情页的链接:

import React from 'react';
import Link from 'next/link';
import { cars } from '../../../data';

export default function CategoriesCars({ cars }) {
  return (
    <div>
      {cars.models.map((m) => (
        <Link key={m.id} href={`/cars/${cars.name}/${m.id}`} passHref>
          <p>{m.name}</p>
        </Link>
      ))}
    </div>
  );
}

// 原有getStaticPaths、getStaticProps逻辑无需修改
export const getStaticPaths = async () => {
  const paths = cars.map((c) => ({
    params: {
      name: c.name,
    },
  }));
  return { paths, fallback: false };
};

export const getStaticProps = async (context) => {
  const { params } = context;
  const response = cars.filter((c) => c.name === params.name);
  return {
    props: {
      cars: response[0],
    },
  };
};

注:本地静态数据不需要加await,原有代码里的await可以直接删掉,不影响运行

3. 编写三级路由代码

在pages/cars/[name]/[modelId].js中写入以下内容:

import { cars } from '../../../../data';
import Image from 'next/image'; // 用next/image优化图片加载,不需要可以删掉

export default function ModelDetail({ model }) {
  return (
    <div>
      <h1>{model.name}</h1>
      <Image src={model.image} alt={model.name} width={600} height={400} />
    </div>
  );
}

// 生成所有三级路由的静态路径
export const getStaticPaths = async () => {
  const paths = [];
  // 遍历所有分类,再遍历分类下的所有车型,生成全量路径
  cars.forEach(category => {
    category.models.forEach(model => {
      paths.push({
        params: {
          name: category.name,
          modelId: model.id.toString() // 路由参数必须为字符串
        }
      })
    })
  })
  return { paths, fallback: false };
};

// 根据路由参数获取对应车型数据
export const getStaticProps = async (context) => {
  const { params } = context;
  // 先找到对应分类
  const targetCategory = cars.find(c => c.name === params.name);
  // 再从分类下找到对应id的车型,注意路由参数是字符串,要转成数字匹配
  const targetModel = targetCategory.models.find(m => m.id === Number(params.modelId));
  return {
    props: {
      model: targetModel,
    },
  };
};

完成以上操作后即可正常访问/cars/sedan/1这类三级路由。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:09:01