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

如何在Next.js中从对象数组生成单产品页面

在Next.js中为数组对象生成带唯一URL的动态页面

根据你的需求,下面分别针对Next.js的**App Router(13+)和Pages Router(12及以下)**两种架构给出实现方案:


方案一:App Router(Next.js 13+)

1. 整理产品数据

先把产品数组抽离到单独文件中复用,比如创建lib/products.js:

export const products = [
  {
    url: "item-1",
    id: 1,
    name: "Item 1",
    description: "lorem...",
    price: 10
  },
  {
    url: "item-2",
    id: 2,
    name: "Item 2",
    description: "lorem...",
    price: 20
  },
  {
    url: "item-3",
    id: 3,
    name: "Item 3",
    description: "lorem...",
    price: 30
  },
];

2. 创建动态路由页面

在app目录下创建products/[url]文件夹,并添加page.js文件:

import { products } from "@/lib/products";

// 可选:预先生成所有静态页面(SSG),提升加载性能
export async function generateStaticParams() {
  return products.map(product => ({
    url: product.url,
  }));
}

export default function ProductPage({ params }) {
  // 根据URL参数匹配对应产品
  const product = products.find(p => p.url === params.url);

  // 处理产品不存在的情况
  if (!product) {
    return <div>产品不存在</div>;
  }

  // 渲染产品详情
  return (
    <div className="product-detail">
      <h1>{product.name}</h1>
      <p>产品ID:{product.id}</p>
      <p>{product.description}</p>
      <p>价格:${product.price}</p>
    </div>
  );
}

3. 生成产品列表链接(可选)

如果需要展示产品列表,创建app/products/page.js:

import { products } from "@/lib/products";
import Link from "next/link";

export default function ProductsList() {
  return (
    <div className="products-list">
      <h1>产品列表</h1>
      <ul>
        {products.map(product => (
          <li key={product.id}>
            <Link href={`/products/${product.url}`}>{product.name}</Link>
          </li>
        ))}
      </ul>
    </div>
  );
}

方案二:Pages Router(Next.js 12及以下)

1. 整理产品数据

同样创建lib/products.js存放产品数组(内容同App Router方案)。

2. 创建动态路由页面

在pages目录下创建products/[url].js文件:

import { products } from "../../lib/products";

// 预先生成所有静态路径(SSG)
export async function getStaticPaths() {
  const paths = products.map(product => ({
    params: { url: product.url },
  }));

  return { paths, fallback: false }; // fallback: false 表示未预生成的路径返回404
}

// 获取当前路径对应的产品数据
export async function getStaticProps({ params }) {
  const product = products.find(p => p.url === params.url);

  if (!product) {
    return { notFound: true };
  }

  return {
    props: { product }, // 将产品数据传递给页面组件
    revalidate: 60, // 可选:每60秒自动更新页面内容(增量静态再生)
  };
}

export default function ProductPage({ product }) {
  // 渲染产品详情
  return (
    <div className="product-detail">
      <h1>{product.name}</h1>
      <p>产品ID:{product.id}</p>
      <p>{product.description}</p>
      <p>价格:${product.price}</p>
    </div>
  );
}

3. 生成产品列表链接(可选)

创建pages/products.js作为列表页:

import { products } from "../lib/products";
import Link from "next/link";

export default function ProductsList() {
  return (
    <div className="products-list">
      <h1>产品列表</h1>
      <ul>
        {products.map(product => (
          <li key={product.id}>
            <Link href={`/products/${product.url}`}>{product.name}</Link>
          </li>
        ))}
      </ul>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:45:50