Динамические маршруты

Когда вы не знаете точные названия сегментов заранее и хотите создавать маршруты из динамических данных, вы можете использовать динамические сегменты, которые заполняются во время запроса или пререндерятся во время сборки.

Соглашение

Динамический сегмент создается путем заключения имени файла или папки в квадратные скобки: [segmentName]. Например, [id] или [slug].

Доступ к динамическим сегментам можно получить через useRouter.

Пример

Например, блог может включать маршрут pages/blog/[slug].js, где [slug] — это динамический сегмент для постов блога.

import { useRouter } from 'next/router'

export default function Page() {
  const router = useRouter()
  return <p>Пост: {router.query.slug}</p>
}
МаршрутПример 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' }

Сегменты с перехватом всех параметров

Динамические сегменты могут быть расширены для перехвата всех последующих параметров путем добавления многоточия внутри скобок [...segmentName].

Например, pages/shop/[...slug].js будет соответствовать /shop/clothes, а также /shop/clothes/tops, /shop/clothes/tops/t-shirts и так далее.

МаршрутПример 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'] }

Опциональные сегменты с перехватом всех параметров

Сегменты с перехватом всех параметров могут быть сделаны опциональными путем включения параметра в двойные квадратные скобки: [[...segmentName]].

Например, pages/shop/[[...slug]].js будет также соответствовать /shop, в дополнение к /shop/clothes, /shop/clothes/tops, /shop/clothes/tops/t-shirts.

Разница между сегментами с перехватом всех параметров и опциональными сегментами с перехватом заключается в том, что с опциональными маршрут без параметра также будет соответствовать (/shop в примере выше).

МаршрутПример URLparams
pages/shop/[[...slug]].js/shop{ slug: [] }
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'] }