// indax.js
import Axios from "axios";
import Head from "next/head";
import { Header, Divider, Loader } from "semantic-ui-react";
import { useEffect, useState } from "react";
import styles from "../styles/Home.module.css";
import ItemList from "../src/component/ItemList";
export default function Home() {
const [list, setList] = useState([]);
// ์ฒซ ํ๋ฉด์์ ๋ก๋ฉ ํ๋ฉด์ ๋ง๋ค๊ธฐ ์ํด isLoading์ผ๋ก state ์์ฑ
const [isLoading, setIsLoading] = useState(true);
const API_URL =
"http://makeup-api.herokuapp.com/api/v1/products.json?brand=maybelline";
function getData() {
Axios.get(API_URL).then((res) => {
console.log(res.data);
setList(res.data);
// API ํธ์ถ์ด ๋๋๋ฉด setIsLoading๋ false
setIsLoading(false);
});
}
useEffect(() => {
getData();
}, []);
return (
<div>
<Head>
<title>Home | ๋ณด๋ฆฌ๊ตฌ๋ฆฌ</title>
</Head>
{isLoading && (
<div style={{ padding: "200px 0" }}>
<Loader inline="centered" active size="big">
Loading
</Loader>
</div>
)}
{!isLoading && (
<>
<Header as="h3">๋ฒ ์คํธ ์ํ</Header>
<Divider />
<ItemList list={list.slice(0, 9)} />
<Header as="h3">์ ์ํ</Header>
<Divider />
<ItemList list={list.slice(9)} />
</>
)}
</div>
);
}
ํด๋น ์ฝ๋์์ ๊ถ๊ธํ๋ ๋ถ๋ถ
// ์ด ๋ถ๋ถ์ ์ฝ๋๋ฅผ <Header as="h3">๋ฒ ์คํธ ์ํ</Header> <Divider /> <ItemList list={list.slice(0, 9)} /> <Header as="h3">์ ์ํ</Header> <Divider /> <ItemList list={list.slice(9)} /> { !isLoading && <> // ์ฌ๊ธฐ์ ๋ฃ๋ ๊ฒ๊ณผ ๋ฃ์ง ์๋ ๊ฒ์ ์ฐจ์ด๊ฐ ๋ฌด์์ธ์ง.. </>; }
- ์ผ์ชฝ ํ๋ฉด์ด
{!isLoading}
์ ์ฉ ์ / ์ค๋ฅธ์ชฝ ํ๋ฉด์ด ์ ์ฉ ํ
=>{!isLoading}
์ ์์ฑํ์ง ์์๋ ๊ฐ์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค๊ณ ์๊ฐํ๋๋ฐ ์๋์ ๊ฐ๋ ค์ ธ์ ๋ณด์ด์ง ์์์๋ค. ์ ํ์ธํด๋ณผ ๊ฒ!
return (
<div>
<Head>
<title>Home | ๋ณด๋ฆฌ๊ตฌ๋ฆฌ</title>
</Head>
{isLoading ? (
<div style={{ padding: "200px 0" }}>
<Loader inline="centered" active size="big">
Loading
</Loader>
</div>
) : (
<>
<Header as="h3">๋ฒ ์คํธ ์ํ</Header>
<Divider />
<ItemList list={list.slice(0, 9)} />
<Header as="h3">์ ์ํ</Header>
<Divider />
<ItemList list={list.slice(9)} />
</>
)}
</div>
);
[id].js
๋ ๋ก๋ฉ ํ๋ฉด ๊ตฌํNext.js๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ฌ์ ๋ ๋๋ง(Pre-rendering) ํ๋ค => ๋ฏธ๋ฆฌ HTML ํ์ผ์ ๋ง๋ฆ
Pre-rendering์ 2๊ฐ์ง ํํ : ์ฐจ์ด์ ์ ์ธ์ HTML ํ์ผ์ ์์ฑํ๋๊ฐ
getStaticProps
/ getStaticPaths
getServerSideProps
// [id].js
import Axios from "axios";
import Head from "next/head";
import Item from "../../src/component/Item";
// getServerSideProps๋ฅผ ํตํด item์ ๋ฐ์์ฌ ์ ์๋ค.
// ์๋ต๊ฐ์ item์ props๋ก ๋๊ฒจ์ค ์ ์๋ค.
const Post = ({ item }) => {
// ์์ดํ
์ด ์์ผ๋ฉด ์์ดํ
์ ๊ทธ๋ ค์ค๋ค.
// ํ์ด์ง ์์ค์ฝ๋๋ฅผ ํ์ธํ์ ๋ ๋ฐ์ดํฐ๋ค์ด ์ ๋์จ๋ค๋ฉด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ด ์ ๋์ํ๊ณ ์๋ ๊ฒ
// ์ด ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํด SEO, ๊ณต์ ๋ฑ์ด ์ ๋์ํ ์ ์๋ค
// ๊ทธ๋ฆฌ๊ณ ํญ์ ์ต์ ์ํ๋ฅผ ์ ์ง๋๋ฏ๋ก ๊ฐ๊ฒฉ์ด๋ ํ๋งค์ํ ๋ฑ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฐ๋ก ์ ์ฉ๋๋ค.
// ๋ค๋ง ์์ฒญ ํ์๊ฐ ๋์ด๋ ํผํฌ๋จผ์ค๋ ๋จ์ด์ง๋ค
return (
<>
{item && (
<>
<Head>
<title>{item.name}</title>
<meta name="description" content="item.description"></meta>
</Head>
<Item item={item} />
</>
)}
</>
);
};
export default Post;
// getServerSideProps๋ก ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ด
// context๋ params, ์์ฒญ, ์๋ต, ์ฟผ๋ฆฌ ๋ฑ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์ ธ์ ์จ๋ค.
export async function getServerSideProps(context) {
const id = context.params.id;
const apiUrl = `http://makeup-api.herokuapp.com/api/v1/products/${id}.json`;
const res = await Axios.get(apiUrl);
const data = res.data;
return {
props: {
item: data,
},
};
}