Acceso

Utilizando carpeta [...slug] con NextJS 13.4.

toscadev

@ ToscaDevsJS


Vamos a desglosar este código de paso a paso:

App
product/page.tsx
import { products as initialProducts } from "@/mocks/products.json";
import Link from "next/link";

export interface Products {
  products: Product[];
  total: number;
  skip: number;
  limit: number;
}

export interface Product {
  id: number;
  title: string;
  description: string;
  price: number;
  discountPercentage: number;
  rating: number;
  stock: number;
  brand: string;
  category: string;
  thumbnail: string;
  images: string[];
}

export default function Home() {
  return (
    <>
      <h1>Home</h1>

      <section className="h-28">
        <h2>Carrito</h2>
      </section>
      {initialProducts.map((product: Product) => (
        <div key={product.id}>
          <img src={product.thumbnail} alt={product.title} />
          <h2>{product.title}</h2>
          <p>{product.description}</p>
          <p>{product.price}$</p>
          <Link href={"/product/" + product.id}>añadir al carrito</Link>
        </div>
      ))}
    </>

);
}

App
product/[...slug].tsx
import { products as initialProducts } from "@/mocks/products.json";
import { Product } from "@/app/page";

const PageProduct = ({ params }: { params: { slug: string } }) => {
const slug = Number(params.slug);

const post = initialProducts.find((post: Product) => post.id === slug);

if (!post) throw new Error(`Publicar con slug ${params.slug} extraviado.`);
console.log(post?.id);
return (

<>
  <div>pagina de Producto / {params.slug}</div>
  <hr />
  <section className="p-8">
    <div>Nombre{post?.title}</div>
    <div>Descripcion{post?.description}</div>
    <div>Precio{post?.price}</div>
    <img src={post.thumbnail} alt={post.title}></img>
  </section>
</>
); };

export default PageProduct;

Extracción del Slug y Búsqueda del Producto:

import { products as initialProducts } from "@/mocks/products.json";
import { Product } from "@/app/interfaces";

const PageProduct = ({ params }: { params: { slug: string } }) => {

  const slug = Number(params.slug);
  const post = initialProducts.find((post: Product) => post.id === slug);

Manejo de Errores:

if (!post) throw new Error(`Publicar con slug ${params.slug} extraviado.`);

Nota: Si no se encuentra un producto que coincida con el slug proporcionado, lanzamos un error indicando que el producto no fue encontrado.


Renderizado del Componente:

return (
  <>
    <div>pagina de Producto / {params.slug}</div>
    <hr />
    <section className="p-8">
      <div>Nombre{post?.title}</div>
      <div>Descripcion{post?.description}</div>
      <div>Precio{post?.price}</div>
      <img src={post.thumbnail} alt={post.title}></img>
    </section>
  </>
);

Nota: El ? después de post (como en post?.title) es el operador opcional de encadenamiento. Esto significa que si post es null o undefined, no intentará acceder a la propiedad y simplemente devolverá undefined. Esto es útil para prevenir errores si, por alguna razón, el producto no se carga correctamente.


Regresar al Blog.

© Copyright 2024 ToscaDevJS.