[220620 / Day 32] styled components, react swiper, ๊ฒ์ํ ๋ง๋ค๊ธฐ
1. ์คํ์ผ๋ ์ปดํฌ๋ํธ (styled components)
์ ๋ฒ์ scss, module.css ๋๊ฐ์
์ด๋ฒ์ styled components ์ฌ์ฉํด๋ณผ ๊ฒ, css in js ๋ก js, css ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๋ ๊ฒ์
styled compoenets :
- ์์ฆ ๋ฆฌ์กํธ ๊ฐ๋ฐ ํ์ฌ์์ ๋ง์ด ์ฌ์ฉ, ๊ทธ๋์ ๋ง์ด ์ฌ์ฉํด๋ณผ ๊ฒ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ์ ์ค์นํ๊ณ ์ฌ์ฉํด์ผ ํจ, ์ฌ์ค๋ ๋น์ท
- ์ค์น๋ฒ์ terminal ์ npm i styled-components
- ์ต์คํ ์ ์์ vscode-styled-components ๊น์์ค์ผ ์๋์์ฑ์ด ๋จ
- import ํด์ฃผ๊ธฐ : import styled from 'styled-components';
- <Box></Box> ๋ ํ๊ทธ๊ฐ ์๋ ๋์์ธ์ ์ํ ์ปดํฌ๋ํธ
- ๋๋๋๋ ํจ์ ์์ชฝ์ ์์ฑํ๋ฉด ์๋จ, ๊ต์ฅํ ๋๋ ค์ง ์ ์๊ธฐ ๋๋ฌธ์ ์๋จ์ด๋ ํ๋จ ๋ฐ๊นฅ์ชฝ์ ์์ฑํด์ผ ํจ
- const Box = styled.div → ํ๊ทธ Box ์ styled ๋ฅผ div ๋ก ๋ฉํํ๋ค๋ ๋ป, ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ๊ทธ ๋ค์ ` `(๋ฐฑํฑ) ๋ฃ์ด์ ๊ฑฐ๊ธฐ ์์ ์์ฑ ๋ฃ์ด์ฃผ๊ธฐ
- ์์ ๊ฒ์ฌํด๋ณด๋ฉด class="sc-bczRLJ hHPJrx" ์ด๋ ๊ฒ ๋์ด ์๋๋ฐ ์ด๊ฒ ์คํ์ผ๋ ์ปดํฌ๋ํธ, ์คํ์ผ์ด ๋ค ๋ค์ด๊ฐ ์์
2. styled components ๋ฌธ๋ฒ
1) as
- ์๋ฅผ ๋ค์ด div ๋ก ๋ฉํ์ด ์๋๋ผ ul ๋ก ํ๊ณ ์ถ์ผ๋ฉด as ํ๋กญ์ค๋ฅผ ๋ง๋ค๊ณ ul ๋ก ํ๊ฒ ๋ค ์ ์ธํด์ฃผ๋ฉด ๋จ, ๊ทธ๋ผ ul ๋ก ๋ฉํ๋ box ๊ฐ ์์ฑ๋ ๊ฑธ ๋ณผ ์ ์์ → <Box as='ul'>
2) props ์ฌ์ฉ
<Title fontSize='2rem' color='#2345'>์คํ์ผ๋ ์ปดํฌ๋ํธ</Title>
<Title fontSize='1.5rem' color='#456'>CSS IN JS</Title>
<Title color='#745'>fun and easy</Title>
→ ์ด๋ ๊ฒ๋ง ํด์ฃผ๋ฉด ์ ๋ฌ์ด ์๋จ
3) attrs ์ฌ์ฉ
- ํ์ ์ ๋ฒํผ์ด๋ผ๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ฃ๊ณ ์ถ๋ค๋ฉด ์ง์ ๋ฃ์ด๋ ๋์ง๋ง sytled.button.attrs(props => ({})) ํด์ฃผ๋ฉด ๋จ ์ผํญ์ฐ์ฐ์, ์กฐ๊ฑด๋ถ ์ฐ์ฐ์๋ฅผ ํ๊ธฐ ์ํด ์ด๋ ๊ฒ
props.active ๊ฐ๋ง ๊ฐ์ง ์ ๋ง ํด๋์ค ๋ฃ์ด์ ์คํ์ผ ๋ฃ๊ธฐ : className: props.active ? 'btn on' : 'btn'
- ์์ :
4) ํ์ฅ
- ๋ค๋ฅธ ์์์์ ์ ์ฉํ ์คํ์ผ์ ๋์ผํ๊ฒ ์ฃผ๊ณ ์ถ๋ค๋ฉด ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋จ
- ์๋๋ const Btn = styled.button ์ด๋ฐ ์์ผ๋ก ํ๋ฉด ํ๊ทธ Btn ์ styled ๋ฅผ button ์ผ๋ก ๋ฉํํ๋ค๊ณ ์
- ํ์ฅ ๊ธฐ๋ฅ์ style(Btn) ํด์ฃผ๋ฉด Btn ์คํ์ผ์ ํ์ฅํ์ฌ ์ฌ์ฉ๋จ
- ๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ์ฃผ๊ณ ์ถ์ style ์ ์๋ํ๋ ๊ฒ๊ณผ ๋๊ฐ์ด ` `(๋ฐฑํฑ) ์์ ๋ฃ์ด์ฃผ๋ฉด ๋จ
- ์์ :
5) ์ ๋๋ฉ์ด์ ์ ์ฉ
- import ๋จผ์ : import styled, { keyframes } from 'styled-components'; ํด์ค์ผ keyframes ์ธ ์ ์์
- ๊ทธ๋ฆฌ๊ณ styled ์ animation ์ ๋ฆฌํฐ๋ด ๋ฐฑํฑ์ผ๋ก ๋ณ์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ๊ณ ๋ฐ๋ก ๋ณ์๋ก keyframes ์ ๋ฃ์ ์ ๋๋ฉ์ด์ ์์๋ฅผ ์์ฑํด์ฃผ๋ฉด ์ ์ฉ!
- ์์ :
6) ๊ธ๋ก๋ฒ styled ์ ์ฉ
- import { createGlobalStyle } from "styled-components"; ํด์ฃผ๊ณ
- const GlobalStyle = createGlobalStyle` ` ์์ reset.css ๋ฃ์ด์ฃผ๋ฉด ๋จ
- app.js ์ ์ต์์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฌ์์ผ ํจ, ๊ฐ์ผ div ๋ฐ๋ก ๋ฐ์ <GlobalStyle /> ํด์ค์ผํจ
7) ๊ทธ ์ธ๋ scss ์ ๋๊ฐ์
2. ์ค์์ดํผ
- terminal ์์ npm i swiper ์ค์น
- div ์์ ์ค์์ดํผ ํํ์ด์ง์ ์๋ Usage ๋ฃ์ด์ฃผ๋ฉด ๋จ → ๊ธฐ๋ณธํ
- navigation ์ js ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ง๋ง ๋ฆฌ์กํธ๋ props ํด์ค์ผ ํจ ๊ทธ๋ฆฌ๊ณ import ๋ก ๊บผ๋ด์์ผ ํจ
- ๋ฐ๋ณตํ ๊ฑฐ๋ฉด ์ค์์ดํผ ํํ์ด์ง์ demo์ ๋ณด๋ฉด loop={true} ํด์ฃผ๋ฉด ๋ฌดํ ๋ฃจํ
- import ๋ modules ์ ์ฐ๋ ๊ธฐ๋ฅ ์ ๋ฃ์ด์ฃผ๊ณ ์ ์ฐ๋ ๊ธฐ๋ฅ์ ์ ๋นผ์ฃผ๊ธฐ
1) Mainbanner : ๋ฌดํ๋ฃจํ๋ ์คํ ํ๋ ์ด, ์ด๋ ๋ถ๋ฆฟ ํด์ฃผ๋ ๊ฒ๊น์ง
2) SubBanner : ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ก pagination(์ด๋๋ถ๋ฆฟ) ๋ฐ๊ฟ์ฃผ๊ธฐ
- ๋๊ฐ์ง ๋ฐฉ๋ฒ ์์ : ํด๋์ค ์ด๋ฆ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ, ์์๊ฒ์ฌํด์ ํด๋์ค ๋ค์ ๋ณด๊ณ ๊ฑฐ๊ธฐ๋ค๊ฐ ์ ์ฉํด์ฃผ๋ฉด ๋จ
3) ์ด๋ ํ์ดํ ๋ฐ๊พธ๊ธฐ
- ์ง์ ๋ฐ๊พธ๊ธฐ
- ํด๋์ค ์ด๋ฆ
๊ธฐ๋ณธ css ์ ํ๋ฉด์ position ์ ์ค ๊ทธ๋์ nav์ด์ฉ๊ตฌ ์ปดํฌ๋ํธ๋ position ์ฑ์๋ฃจํธ ์ฃผ๋ฉด ์๋์ผ๋ก ๋ฐ๋ผ๊ฐ, ๋ถ๋ชจ์์์ ๋ ๋ฌํฐ๋ธ ์์ค๋ ๋จ
3. ๊ฒ์ํ ๋ง๋ค๊ธฐ
1) ListTotal.jsx
const [lists, setLists] = useState([]);
// ๋ฐ์ดํฐ๋ ํ๋ฒ๋ง ๋ถ๋ฌ์ฌ๊ฑฐ๋๊น ๋ฌด์กฐ๊ฑด useeffect
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts')
.then((res) => res.json()) // (res) ๋ณ์ ์ด๋ฆ์ด๋๊น ์๋ฌด ์ด๋ฆ ์จ๋ ๋จ
.then((data) => setLists(data)) // (data) ๋ณ์ ์ด๋ฆ์ด๋๊น ์๋ฌด ์ด๋ฆ ์จ๋ ๋จ
}, [])
// async await ์ ๋ฃ์๋๋ฐ ํด์ค๋ ์๊ด ์์
console.log(lists) // ๋ฐ์ดํฐ 100 ๊ฐ ๋ค์ด์ด
→ ๋ฐ์ดํฐ ๊ณ์ ๋ถ๋ฌ์ค๋ฉด ๋๋๋ง์ ๋ฌด๋ฆฌ๊ฐ๋๊น ํ๋ฒ๋ง ๋ถ๋ฌ์ค๋ผ๊ณ useEffect ์ฌ์ฉ
→ ์๋ ๋ฐ์ดํฐ ํ์ผ import ํด์ ๋ณ์ ์ง์ ํ ๋ค์ map ์ผ๋ก ๋๋ฆฐ ํ ํจ์ ํธ์ถ ๊ณผ์ ์ ๊ฑฐ์น๋ ๋ณต์กํ ์์ ์ ํ์์
→ ๊ทธ๊ฑธ useEffect ๋ก
!!!!!๋ค์ ์ ๋ฆฌ
2) ๊ฒ์ํ ๊ณต์
- ๊ฒ์๋ฌผ ์ธ๋ฑ์ค 0~9, 10~19, 20~29… ํด์ ํ์ด์ง๋น 10๊ฐ ๊ฒ์๋ฌผ ๋ณด์ฌ์ฃผ๋ ๊ฒ
- ๊ฒ์ํ ๊ณต์์ด ์์ : ํํ์ด์ง๋น ๊ฐ์์ ์์๋ฒํธ์ ๋๋ฒํธ๋ฅผ ์์์ผํจ
// ๊ฒ์ํ ๊ณต์
// ์ ๋ ํธ ๋ฐ์ค ๋ญ 10๊ฐ 20๊ฐ ๋ณด์ด๋๋ก ํ ๊ฑฐ๋ฉด usestate ๋ก ํด์ผํจ
const LIST_PER_PAGE = 10; // ํ ์ฅ์ ๋ณด์ฌ์ง ๋ฆฌ์คํธ ์
const [page, setPage] = useState(1) // ํ์ด์ง, ์ด๊ธฐ๊ฐ์ 1๋ก ํด์ 1๋ก ์์
// startNum ์ ํํ์ด์ง ๋น ์์ํ๋ ๋๋ฒ, endNum ๋ ํํ์ด์ง ๋น ๋๋๋ ๋๋ฒ
const startNum = (page - 1) * LIST_PER_PAGE // 1-1*10 => 0 10 20 30...
const endNum = startNum + LIST_PER_PAGE // 0+10 => 10 20 30 40...
- 1-1x10 → 10์ ํ์ด์ง ๊ฐ์
- disabled ๊ฐ ๋ญ์ง..? ๊ฐ๋ฅํ์ง ์์ ๋? ๋ ํ ์ ์์ ๋?
3) fill ๋ฉ์๋
// ๋น์ด์๋ ๊ฑธ ์ฑ์์ฃผ๋ ๋ฉ์๋ fill
PagesNumArray.fill();
console.log(PagesNumArray) // (10) [undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined]
→ PagesNumArray.fill();
๊ณผ์ : ํ๋์ฉ ๋์ด๊ฐ๋ ํด๋์ค ๋ง๋ค์ด์ ์ ์ฉํด๋ณด๊ธฐ, ์ซ์ ํด๋ฆญํ๋ฉด ํ๋์ฉ css ํจ๊ณผ ๋ฃ๊ธฐ
๊ทธ๋ฆฌ๊ณ 5๊ฐ์ฉ๋ง ํ์ด์ง์ ๋ณด์ฌ์ฃผ๊ณ ๊ทธ ๋ค์ ๋๋ฅด๋ฉด ๋ 5๊ฐ์ฉ ๋ณด์ด๊ณ ์ด๋ฐ ๊ฒ๋ ํด๋ณด๊ธฐ ex) 1,2,3,4,5 ๋ค์ 6,7,8,9,10