Dynamische Routen

Wenn Sie die genauen Segmentnamen nicht im Voraus kennen und Routen aus dynamischen Daten erstellen möchten, können Sie Dynamische Segmente verwenden, die zur Laufzeit gefüllt oder vorgerendert werden.

Konvention

Ein dynamisches Segment wird erstellt, indem ein Datei- oder Ordnername in eckige Klammern gesetzt wird: [segmentName]. Zum Beispiel [id] oder [slug].

Auf dynamische Segmente kann über useRouter zugegriffen werden.

Beispiel

Ein Blog könnte beispielsweise die Route pages/blog/[slug].js enthalten, wobei [slug] das dynamische Segment für Blogbeiträge ist.

import { useRouter } from 'next/router'

export default function Page() {
  const router = useRouter()
  return <p>Beitrag: {router.query.slug}</p>
}
RouteBeispiel-URLparams
pages/blog/[slug].js/blog/a{ slug: 'a' }
pages/blog/[slug].js/blog/b{ slug: 'b' }
pages/blog/[slug].js/blog/c{ slug: 'c' }

Catch-all Segmente

Dynamische Segmente können erweitert werden, um alle nachfolgenden Segmente zu erfassen, indem man drei Punkte in die Klammern setzt: [...segmentName].

Zum Beispiel wird pages/shop/[...slug].js mit /shop/clothes, aber auch mit /shop/clothes/tops, /shop/clothes/tops/t-shirts usw. übereinstimmen.

RouteBeispiel-URLparams
pages/shop/[...slug].js/shop/a{ slug: ['a'] }
pages/shop/[...slug].js/shop/a/b{ slug: ['a', 'b'] }
pages/shop/[...slug].js/shop/a/b/c{ slug: ['a', 'b', 'c'] }

Optionale Catch-all Segmente

Catch-all Segmente können optional gemacht werden, indem der Parameter in doppelte eckige Klammern gesetzt wird: [[...segmentName]].

Zum Beispiel wird pages/shop/[[...slug]].js auch mit /shop übereinstimmen, zusätzlich zu /shop/clothes, /shop/clothes/tops, /shop/clothes/tops/t-shirts.

Der Unterschied zwischen Catch-all und optionalen Catch-all Segmenten besteht darin, dass bei optionalen Segmenten auch die Route ohne Parameter übereinstimmt (/shop im obigen Beispiel).

RouteBeispiel-URLparams
pages/shop/[[...slug]].js/shop{}
pages/shop/[[...slug]].js/shop/a{ slug: ['a'] }
pages/shop/[[...slug]].js/shop/a/b{ slug: ['a', 'b'] }
pages/shop/[[...slug]].js/shop/a/b/c{ slug: ['a', 'b', 'c'] }