index.js
์ [...params].js
๋ค.index.js
<script>
import Head from "next/head";
import Link from "next/link";
import Seo from "../../component/Seo";
import { useState, useEffect } from "react";
import { useRouter } from "next/router";
export default function Home({ results }) {
const router = useRouter();
const onClick = (id, title) => {
router.push(`/movies/${title}/${id}`);
};
console.log(results);
return (
<div className="container">
<Seo title="Home" />
{results?.map((item) => (
<div onClick={() => onClick(item.id, item.original_title)} className="movie" key={item.id}>
<img style={{ width: "300px", height: "450px" }} src={`https://image.tmdb.org/t/p/w500${item.poster_path}`} />
<h4>
<Link href={`/movies/${item.original_title}/${item.id}`}>{item.original_title} </Link>
</h4>
</div>
))}
</div>
</script>
[...params].js
<script>
import { useRouter } from "next/router";
import Seo from "../../../component/Seo";
export default function Detail({ params }) {
const router = useRouter();
const [title, id] = params || [];
return (
<div>
<Seo title={title} />
<h4>{title || "Loading..."}</h4>
</div>
);
}
export function getServerSideProps({ params: { params } }) {
return {
props: {
params,
},
};
}
</script>
์์ ์ฝ๋๋ฅผ ์ ์ฉํ์ ์ ํ์ด์ง์์ค์์ ์ฐ๋ฆฌ์ ์์ดํ
์ ๋ณด๊ฐ ๋์ค๋์ง ํ์ธํด๋ณธ ๊ฒฐ๊ณผ
์ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ํ params์ ํฌํจ๋ title์ด Seo์ปดํฌ๋ํธ์ ์ ๋ฌ๋์ด ์์ดํ
์ ๋ณด๊ฐ ์น Head์ url์ฃผ์์ ์ ์์ ์ผ๋ก ๋์ค๋ ๊ฒ๋ ํ์ธํ ์์๋ค.
index.js
์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ์์ดํ
์ title๊ณผ id์ ๋ณด๋ฅผ [...params].js
์ ๋ณด๋ด๋ ๋ถ๋ถ์ ์ฐพ์ ์ ์๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๊ณ ์ถ์ ์์ดํ
์ ๋ณด๋ค์ ์์ ๋ฌ๋๊ฒ์ ๊ฒฐ๊ณผ์ฌ์ง์ผ๋ก ๋ณผ์์์๋ค. ์ด๋ป๊ฒ ํ๋ผ๋ฏธํฐ๊ฐ๋ค์ด [...params].js
์ ๋ณด๋ด์ง์์์๋ ๊ฒ์ผ๊น?
โ ํด๋น ํ์์ urlํ์ด์ง๋ฅผ ์ ์ํ [...params].js
ํ์ผ์ ์ด๋ฆ์ธ ์ฆ, 'params'๋ผ๋ ๋ณ์์ ๋ฐฐ์ด ํ์์ผ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
<script>
import { useRouter } from "next/router";
import Seo from "../../../component/Seo";
export default function Detail({ params }) {
const router = useRouter();
const [title, id] = params || [];
console.log("params์์ ์ฅ๋๊ฐ", params);
return (
<div>
<Seo title={title} />
<h4>{title || "Loading..."}</h4>
</div>
);
}
</script>
ํด๋น ์ปดํฌ๋ํธ์์
1. router๋ฅผ ์ด์ฉํด ๋ฐ์์ค๋ ๋ฐฉ๋ฒ
๋ค๋ง, router๋ฅผ ์์ฑํ๋ ค๋ฉด js์คํฌ๋ฆฝํธ๋ฅผ ํตํด ๋ผ์ฐํฐ๋ฅผ ํ์ฑํ๋ ์๊ฐ์ด ํ์ํจ.
๊ทธ๋์ ๋ง์ฝ router๋ฅผ ์์ฑํด์, router๋ฅผ ํตํด params ๊ฐ์ ๋ฐ์์ค๋ ค๋ฉด
( const [title, id] = router.query.params )
, ์ฒ์์๋ ์๋ฌ๊ฐ ๋๋ค.
์๋ฌ๊ฐ ๋๋ ์ด์ ๋, router๊ฐ ์์ผ๋, router.query.params ๊ฐ๋ ์ป์ ์ ์๋๋ฐ,
const [title, id]=router.query.params; ์์ผ๋ก title์ด๋ id ๋ณ์์, ์๋ ๊ฐ์ ํ ๋นํ๋ ค ํ๋
์๋ฌ๊ฐ ๋๋ค.
๊ทธ๋์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋น ๋ฐฐ์ด์ ์ด์ฉํ ๊ฒ์ด๋ค.
const [title, id] = router.query.params || [];
์กฐ๊ธ ์๊ฐ์ด ์ง๋ router๊ฐ ์์ฑ๋๋ฉด, ์๋ฒ์์ ๊ฐ์งํ๊ณ ์๋ params๊ฐ์ฒด ๊ฐ์ router.query.params๋ฅผ ํตํด ์ป์ด์ฌ ์ ์๋ค.
2. rouer์ด์ฉํ์ง ์๊ณ ๋ค์ด๋ ํธ๋ก server๋ก ๋ถํฐ ๋ฐ์์ค๋ ๋ฐฉ๋ฒ
<script>
export function getServerSideProps(**{params: {params} }**) {
return { props: {params} };
}
</script>
์ด๋ {params: {params}
๊ฐ์ฒด๋ฅผ ์๋ฒ๋ก ๋ถํฐ ๋ฐ์์ค๊ณ , ํ์ ํ์ด์ง์ props๋ก {params}
๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ ๊ฒ์ด๋ค.
<script>
export default function Detail({ params }) {
const router = useRouter();
const [title, id] = params || [];
console.log("params์์ ์ฅ๋๊ฐ", params);
return (
<div>
<Seo title={title} />
<h4>{title || "Loading..."}</h4>
</div>
);
}
export function getServerSideProps({ params: { params } }) {
return {
props: {
params,
},
};
}
</script>
๊ทธ๋ฌ๋ฉด ์์ ์ฝ๋์ ๊ฐ์ด params๊ฐ์ ์ ๋นผ๋ด์ ์ฌ์ฉํ ์ ์๋ค.
getSeverSideProps ํจ์๋ฅผ ์ด์ฉํด์ ์๋ฒ๋ก๋ถํฐ ๊ทธ ๊ฐ์ฒด ๋ชจ์ ๊ทธ๋๋ก๋ฅผ ๋ฐ์์ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฆฌํด์ {params}๋ฅผ props๋ก ํ๋ค.
ํด๋น url์ฃผ์๊ฐ ํ์ฑํ๋๋ ํจ์์ธ Detailํจ์๊ฐ {params}๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์๋ค์ฌ์ ๊ทธ์์ ๋ด์ฉ์ ์ํ๋ ๋ณ์์ ๋ฃ์ด์ ์ฌ์ฉํ ์ ์๋ค.
pages์ movies ํด๋ ๋ฐ์ [...parms].js๋ผ๋ ํ์ผ์ ๋ง๋๋ ์๊ฐ, next.js์๋ฒ๋ { params: { params: [ , ] } }
๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฌ๋ฏ๋ก (http://localhost:3000/movies/#####/****)/?? ํ์์ url ์ฃผ์๋ก ์ด๋ํ๊ฒ ๋๋ฉด
์๋ฒ์ { params: { params: [ #### , *** , ?? ] } }
๊ฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์ด๊ฐ์ฒด๊ฐ์ ๋ฐ์์ค๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
1. router์ ์ด์ฉํ ๋ฐฉ๋ฒ
2. getSeverSideProps()๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
2๋ฒ๋ฐฉ๋ฒ์ 13 ์ต์ ๋ฒ์ ์์๋ ์ฌ์ฉํ์ง์๋๋ค๊ณ ํ๋ค.
๋์ ์ด๊ฑธ๋ก ์ฌ์ฉํฉ๋๋ค.
<script>
export async function getStaticProps({ params }:Params) {
return {
props: { params },
};
}
export async function getStaticPaths() {
return {
paths: [], // ๋์ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฏ๋ก ๋น ๋ฐฐ์ด๋ก ์ค์
fallback: 'blocking', // ๋ค๋ฅธ ๊ฒฝ๋ก๋ก์ ์ ๊ทผ์ ์๋ฒ ์ฌ์ด๋์์ ๋๊ธฐ
};
}
</script>
์ฐธ๊ณ ์๋ฃ
๋
ธ๋ง๋์ฝ๋-Next์์ํ๊ธฐ
๋
ธ์
์ฐธ๊ณ -nextjs์์ params ๋ฐ router