Next.js의 Router는 file-system 기반
폴더
1. pages/
2. src/pages/
File system은 pages 폴더 아래 있어야하며 1,2번 구조가 모두 존재한다면 1번이 우선순위를 가진다.
하나의 파일로 다양한 값을 받아서 여러 파일을 대체할 수 있다.
pages/category/[slug].js // /category/food
pages/[username]/[info].js // /hj/age
pages/cart/[...slug].js // /cart/*
pages / category / [[...slug]].js // /category -> ok!
옵셔널 slug로, 폴더아래 index.js를 지정해주지 않더라도 접근가능하다.
import { useRouter } from 'next/router';
const router = userRouter;
const { slug } = router.query;
const { slug, from } = router;
console.log(slug); // food
console.log(from); // event
const { slug } = router;
console.log(slug); // food
pages 안의 [slug]가 우선시 된다. query의 slug는 무시된다.
const { username, info } = router;
console.log(username); // hj
console.log(info); // age
pages/cart/[...slug].js -> slug는 배열 형태
<Link href={"url"} />
or
router.push("url")
getServerSideProps / getStaticProps등을 다시 실행시키지 않고, 현재 상태를 잃지 않은 상태로 url을 바꾸는법
대신 동일한 페이지에서 query만 바뀌는 경우에만 해당
- location.replace("url")
- router.push(url);
- router.push(url, as, { shallow: true });
import Layout from 'components/Layout';
import SubLayout from 'components/SubLayout';
import { useRouter } from 'next/router';
import { useState } from 'react';
export async function getServerSideProps() {
console.log('server');
return {
props: {}
};
}
export default function MyInfo() {
const router = useRouter();
const [clicked, setClicked] = useState(false);
const { status = 'initial' } = router.query;
return (
<>
<h1>clicked : {String(clicked)}</h1>
<h1>status : {status}</h1>
<button
onClick={() => {
setClicked(true);
location.replace('/settings/my/info?status=editing');
// 로컬 상태 유지 x, reRendering -> clicked : false, status: editing, 'server'
}}
>
edit replace
</button>
<br />
<button
onClick={() => {
setClicked(true);
router.push('/settings/my/info?status=editing');
// 로컬 상태 유지, 서버 재호출 -> clicked : true, status: editing, 'server'
}}
>
edit router push
</button>
<br />
<button
onClick={() => {
setClicked(true);
router.push('/settings/my/info?status=editing', undefined, { shallow: true });
}}
// 로컬 상태 유지, 서버 호출 x -> clicked : true, status: editing
>
edit router shallow
</button>
</>
);
}