next에서 다이나믹 라우팅을 구현하기는 매우 쉽습니다.
예를 들어 "/photo/1"과 "/photo/34"등 이처럼 photo뒤의 숫자를 변경하여 원하는 사진을 가져오는 api인 경우 일일이 숫자가 다른 api를 만드는 것은 매우 힘듭니다.
리액트에서는 "/photo/:id"이처럼 뒤에 :
을 붙여 컴포넌트에서 쿼리로 받아왔지만 넥스트에서는 파일명 또는 폴더명을 [id].js
로 만듭니다.
function photo(){//[id].js
const router = useRouter();
const {id} = router.query;
return (
<div>이사진의 숫자는{id}입니다.</div>
)
}
즉 저 컴포넌트에 api를 보내고 싶으면 'pages/photo/[id].js' 이경로에 컴포넌트를 만들면 됩니다.(useRouter는 next에 기본으로 내장이 되있습니다.)
리액트에서 라우터를 구현하려면 여러가지 컴포넌트를 임포트를 해야했습니다. 하지만 지난 포스팅에서 말한것처럼 모든 페이지는 _app.js를 통하고 여기서 라우팅을 하기위해선 Link라는 컴포넌트를 사용해야합니다. 사용법은 리액트와 비슷합니다.
import Link from "next/link";
function photo(){//[id].js
const router = useRouter();
const {id} = router.query;
return (
<div>
이사진의 숫자는{id}입니다.
<Link href="/">
<a>this page!</a>
</Link>
</div>
)
}
특이한점은 Link컴포넌트 안에 a태그를 넣어주는 것이 다른 점입니다. 여기서 주의할 점은
next의 Link 컴포넌트의 장점은 prefetch기능입니다. prefetch란 다음 경로를 미리 예측하여 다음 경로에 있는 컴포넌트를 미리 랜더링하는것입니다. 만약 컴포넌트가 화면에 보이면 그 컴포넌트의 경로를 뒤에서 미리 랜더링을 한다는 의미입니다. 정적생성을 사용하는 페이지는 더 빠른 페이지 전환을 위해 데이터가 포함된 JSON파일을 미리 로드합니다.
이것 외에도 Link태그의 props는 다음과 같습니다.