요청 : /
👉 폴더: pages/index.js
요청 : /search
👉 폴더: pages/search.js
라우트별로 폴더 분리가능
요청 : 동적인 경로1 /country/{code}
👉 폴더: pages/country/[code].js
요청 : 동적인 경로2 /country/{code}/{year}
👉 폴더: pages/country/[...code].js
(Catch-All)
요청 : 동적인 경로3 /country/{code?}
(url파라미터가 없는 경우)
👉 폴더: pages/country/[[...code]].js
(Optional Catch-All)
/pages/post/[post_id].js
-[post_id].js
페이지
import { useRouter } from "next/router";
export function PostDetail() {
const router = useRouter();
const { code } = router.query; // 👈🏻URL Parameter로 전달된 post_id에 접근
return <div></div>;
}
<Link href="경로" />
(※ href ※)//index.js
import Link from "next/link";
export default function Home() {
const code = "KOR";
return (
<div>
Home Page
<div>
<Link href={"/search"}>Search Page 이동</Link> // 👈🏻 일반문자 형태
</div>
<div>
<Link
href={{ // 👈🏻 url오브젝트 형태 (pathname, query)
pathname: "/country/[code]",
query: { code: code },
}}
>
{code}페이지로 이동
</Link>
</div>
</div>
);
}
※ react router와 헷갈리지 않기
<Link to="">
export function PageA() {
const router = useRouter();
const onClick = () => {
router.push("/") // 👈🏻 push 함수사용
};
return (
<button onClick={onClick}>인덱스 페이지로 이동</button>
);
}
참고
router.replace()
: 뒤로가기 방지하면서 페이지 이동router.back()
: 뒤로가기router.reload()
: 새로고침
./pages/_app.js
export default function App({ Component, pageProps }) {
const EmptyLayout = ({ children }) => <>{children}</>;
const Layout = Component.Layout || EmptyLayout;
return (
<Layout>
<Component {...pageProps} />
</Layout>
);
}
./pages/post.js
export function Post() {
return <div>...</div>;
}
Post.Layout = ({ children }) => <main>{children}</main>; // 👈🏻
./pages/about.js
export function About() {
return <div>...</div>;
}
/post
페이지는 <main>
태그로 감싸져 렌더링된다./about
페이지는 그대로 렌더링 된다./post
페이지일 경우 <main>
태그로 페이지를 감싸는 레이아웃이 적용되고 /about
페이지일 경우 아무런 레이아웃도 적용되지 않는다.