✏️ Next.js

[pages] Dynamic Routes

category
✏️ Next.js
date
thumbnail
slug
next-js-pages-Dynamic-Routes
author
status
Public
tags
pages router
summary
type
Post
 
Next.js 에서는 Dynamic Routes 를 이용해 동적인 주소에서 다양하게 보여준다.
이때 [slug]를 사용한다.
 

그렇다면 [slug] 값은 어떻게 활용할까?

 
import { useRouter } from 'next/router';

const router = useRouter();

const { slug } = router.query;
 
ex)
pages/blog/[slug].js
[slug] is the Dynamic Segment for blog posts.
 
import { useRouter } from 'next/router';

export default function Blog() {
	const router = useRouter();
	const { slug } = router.query;
	return (
		<h1>{slug}</h1>
	)
}
pages/blog/[slug].js
 
⇒ blog/post1 로 접근 시 화면에 post1 이 보여지게 된다.
 
 

만약 다양한 쿼리를 사용했다면?

 
ex)
pages/blog/[slug].js
[slug] is the Dynamic Segment for blog posts.
 
import { useRouter } from 'next/router';

export default function Blog() {
	const router = useRouter();
	const { slug, when, who } = router.query;
	return (
		<>
			<h1>{slug}</h1>
			<h2>{when}</h2>
			<h3>{who}</h3>
		</>
	)
}
pages/blog/[slug].js
 
⇒ blog/post1?when=20230516&who=Lami 으로 접근 시
<h2> 태그 안에 20230516, <h3> 태그 안에 Lami가 보여진다.
{ “slug”: “post1”, “when”: “20230516”, “who”: “Lami” }
notion image
 

다중 슬러그 사용 시

 
ex)
pages/[username]/[info].js
import { useRouter } from 'next/router';

export default function Blog() {
  const router = useRouter();
  const { username, data, name, age } = router.query;
  return (
    <>
      <h1>
        {username}'s {data}
      </h1>
      <h3>
        {name} {age}
      </h3>
    </>
  );
}
pages/[username]/[data].js
 
⇒ Lami/data?name=HalamLee&age=25 로 접근 시
notion image
 
 
ex2)
pages/[username]/[…info].js
const { slug } = router.query
slug 는 배열
import { useRouter } from 'next/router';

export default function Blog() {
  const router = useRouter();
  const { username, info } = router.query;
  return (
    <>
      <h1>
        {username} {info}
      </h1>
    </>
  );
}
 
⇒ Lami/Halam/Lee 로 접근 시 <h1> 태그에 Lami HalamLee 가 보여진다.
notion image
 
info 부분은 배열이기 때문에 위 코드에서 return 전에 출력한다면 배열 값이 보인다.
console.log(info); // ["Halam", "Lee"]
 
 

Optional Catch-all Segments

💡
pages/cart/[…slug].js ⇒ /cart 로 접근하면 404가 뜬다.
pages/cart/[[…slug]].js ⇒ /cart 로 접근해도(slug가 존재하지 않아도) 가능하다.
 
위에서 slug를 이용한 다이나믹 라우트 예시에서는 index.js 페이지를 만들지 않았기 때문에 slug를 쓰지 않으면 404 에러가 뜬다.
이를 해결하고, slug 없이 접근했을 때도 동작하게 하려면 Optional 방법을 쓰면 된다.
 
 
이는 […info].js 대신 [[…info]].js 를 사용하면 된다.
 
기존 […info].js 사용
notion image
notion image
 
수정 [[…info]].js 사용
notion image
notion image
 

참고