Dynamic Routes
정확한 세그먼트 이름을 미리 알 수 없고 동적 데이터로 라우트를 생성할 경우, 요청 시 또는 빌드 시 미리 렌더링된 동적 세그먼트를 사용할 수 있습니다.
Convention
동적 세그먼트는 파일 또는 폴더 이름을 대괄호로 감싸서 만들 수 있습니다: [segmentName]
. 예를 들어, [id]
or [slug]
.
동적 세그먼트는 useRouter
에서 접근할 수 있습니다.
Example
예를 들어, 블로그는 [slug]
가 블로그 게시물의 동적 세그먼트인 pages/blog/[slug].js
라우트를 포함할 수 있습니다.
import { useRouter } from 'next/router'
export default function Page() {
const router = useRouter()
return <p>Post: {router.query.slug}</p>
}
Route | Example URL | params |
---|---|---|
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 Segments
동적 세그먼트는 대괄호 안에 줄임표를 추가하여([...segmentName]
) 모든 후속 세그먼트를 포함하도록 확장할 수 있습니다.
예를 들어, pages/shop/[...slug].js
는 /shop/clothes
뿐만 아니라 /shop/clothes/tops
, /shop/clothes/tops/t-shirts
등에도 일치합니다.
Route | Example URL | params |
---|---|---|
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'] } |
Optional Catch-all Segments
Catch-all 세그먼트는 매개변수를 이중 대괄호에 포함하여 선택 사항으로 만들 수 있습니다: [[...segmentName]]
.
예를 들어, pages/shop/[[...slug]].js
는 /shop/clothes
, /shop/clothes/tops
, /shop/clothes/tops/t-shirts
뿐만 아니라 /shop
과도 일치합니다.
catch-all과 optional catch-all 세그먼트의 차이점은 optional의 경우 매개변수 없이도 경로가 일치한다는 점입니다(위 예제의 shop
).
Route | Example URL | params |
---|---|---|
pages/shop/[[...slug]].js | /shop | { slug: undefined } |
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'] } |