styled-components๋ CSS in JS๋ผ๋ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. CSS in JS๋ ๋ง๊ทธ๋๋ก CSS ํ์ผ์ ์์ฑํด ์คํ์ผ๋ง ๊ด๋ จ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๋์ ์, JS ์์ CSS๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
์ด์ ๊ฐ์ด CSS in JS๋ฅผ ์ ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์๋๋ฐ, ๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ด styled-components์ ๋๋ค. ์ ๋ ๊ธฐ์ด์ ์ธ ์ฌ์ฉ๋ฒ์ ์ตํ๊ธฐ ์ํด ์์ฃผ ๊ฐ๊ฐํ ๋ฒํผ์ ์ปดํฌ๋ํธํ ํ๋ค์ styled-component๋ฅผ ์ ์ฉํด๋ณด์์ต๋๋ค. ๊ณต๋ถํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ ๋ฆฌํ์ต๋๋ค. styled-component๋ฅผ ๊ณต๋ถํ ๋ ๊ผญ ์ฐธ๊ณ ํ์๊ธธ ๋ฐ๋๋๋ค๐
๋ํ styled-components์ ์๋ ์๋ฆฌ ๋ฐฉ์์ ๋ค์ ๋งํฌ์ ์ค๋ช ๋์ด ์์ต๋๋ค!
์ ๋ ์๋์ ๊ฐ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ ์ฉํ์ต๋๋ค.
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
ํฐ๋ฏธ๋์์ npm install styled-components ๋๋ yarn add styled-components ๋ฅผ ์ ๋ ฅํด ์ค์นํฉ๋๋ค.
2. import ํ๊ธฐ
์ ์ฉํ ํ์ผ ์ต์๋จ์ import ํฉ๋๋ค.
{css}๋ ์๋์์ ๋ฐฐ์ฐ๊ฒ ๋ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ํ์ํ๊ธฐ ๋๋ฌธ์ importํ์ต๋๋ค.
์ฒ์์๋ styled๋ง importํ๊ณ , ๋์ค์ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ด ํ์ํ ๋ ์ถ๊ฐํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
3. ๊ธฐ๋ณธ ์คํ์ผ๋ง
์ ๋ Button์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์๋์ ๊ฐ์ด ์คํ์ผ๋ง ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ฃผ๊ณ , return ๋ถ๋ถ์์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํฉ๋๋ค.
๐ก 3-1. {children}? parameter ๋ถ๋ถ์ ์ค๊ดํธ๊ฐ ๋ค์ด๊ฐ๋ ์ด์
์๋ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ props๊ฐ์ ์กฐํํ ๋๋ 'props.props๋ช '๊ณผ ๊ฐ์ด ์ฌ์ฉํด์ผํฉ๋๋ค. ํ์ง๋ง ๋งค๋ฒ ์ฌ์ฉํ๊ธฐ ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก, ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ํจ์์ parameter ๋ถ๋ถ์์ props ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋ณ์์ฒ๋ผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๊ฐ ๋ง๋ ์์ ์์ children ์ญ์ props ๊ฐ์ฒด์ ํ๋กํผํฐ์ธ๋ฐ์. ๋ฐ๋ผ์ props.children์ ํจ์ parameter์์ ๊ตฌ์กฐ๋ถํดํ ๋น ๋ฌธ๋ฒ์ ํ์ฉํด children์ผ๋ก ์กฐํํฉ๋๋ค.(๋ค๋ง, children์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ ์ธํ ํ์๋ ์์ต๋๋ค. ์ปดํฌ๋ํธ ํ๊ทธ ๋ด๋ถ์ ๋ค์ด๊ฐ๋ ์์๊ฐ children์ ๊ฐ์ด ๋ฉ๋๋ค.) ๋ฒจ๋กํผํธ๋์ ๊ธ์์ ๋ ์์ธํ ๋ด์ฉ๊ณผ ์์ ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
โญ3-2. ์ปดํฌ๋ํธ ํ์ผ์ ๋ถ๋ฆฌํ๋ฉด, ์ปดํฌ๋ํธ๋ช ์ ์ ์ฌ์ฉํ์!
๋ํ ์ฃผ์ํ ์ ์, ์ปดํฌ๋ํธ ํ์ผ์ ๋ถ๋ฆฌํ ๊ฒฝ์ฐ โ styled-components๋ก ์คํ์ผ๋ง๋ ์ปดํฌ๋ํธ๋ช ๊ณผ โกexportํด์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ช ์ ๋ค๋ฅด๊ฒ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ์ต์๋จ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ App์์ Button ์ปดํฌ๋ํธ ์คํ์ผ๋ง์ ์ํด styled-components๋ก ์คํ์ผ๋ง ์ปดํฌ๋ํธ๋ฅผ ์ ์ํด์ฃผ๋ ๊ฒฝ์ฐ, App ์ปดํฌ๋ํธ์ return ๋ถ๋ถ์ ํด๋น ์คํ์ผ๋ง ์ปดํฌ๋ํธ๋ช ์ ๋ฐ๋ก ์์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ปดํฌ๋ํธ ํ์ผ์ ๋ถ๋ฆฌํ ๊ฒฝ์ฐ, Button ์ปดํฌ๋ํธ๋ฅผ exportํ๊ธฐ ์ํด ํจ์๋ก ์ ์ํด์ผ ํ๋๋ฐ ์คํ์ผ๋ง ์ปดํฌ๋ํธ๋ช ์ ์ด๋ฏธ ์๋จ์์ ์ ์ํ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ๋ช ์ด ์ค๋ณต๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ฆ ์คํ์ผ๋ง์ฉ ์ปดํฌ๋ํธ๋ช ๊ณผ exportํ ์ปดํฌ๋ํธ๋ช ์ ๋ฐ๋ก ์ ์ํด์ฃผ์ด์ผ ์ค๋ณต๋์ง ์์ต๋๋ค. (๋ง์ฝ ๋์ผํ๊ฒ ์ง์ ํด์ค๋ค๋ฉด "Identifier has already declared" ๋ผ๋ ์๋ฌ๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค.)
๋ฐ๋ผ์ ์ ๋ ์คํ์ผ๋ง์ฉ ์ปดํฌ๋ํธ๋ช ์ StyledButton์ผ๋ก, exportํ์ฌ App.js์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ช ์ Button์ผ๋ก ์ง์ ํด์ฃผ์์ต๋๋ค.
4. props๋ฅผ ํ์ฉํ ์คํ์ผ๋ง
ํํธ, props๋ฅผ ํ์ฉํ์ฌ ๋์ผํ ์ปดํฌ๋ํธ๋ง๋ค props๋ฅผ ๋ค๋ฅด๊ฒ ์ฃผ์ด ๋ค๋ฅด๊ฒ ์คํ์ผ๋ง ํ ์ ์์ต๋๋ค. ๋์ผํ Button ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ณ , ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ์ color๋ผ๋ props๊ฐ์ ๋ฐ์ ์๊น์ ๋ค๋ฅด๊ฒ ๋ ๋๋งํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ Tagged Template Literals๋ผ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋จํ๊ฒ ๋งํด์, JS์์ ์ฌ์ฉํ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํ์ฉํด ํจ์๋ ๊ฐ์ฒด๋ฅผ ํํํ ์ ์๋ ๋ฌธ๋ฒ์ ๋๋ค. ์ผ๋ฐ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก JS ํํ์์ธ ํจ์๋ฅผ ${}์์ ์์ฑํ ์ ์์ผ๋ฉฐ, ํ์ดํ ํจ์๊ฐ ๋ค์ด๊ฐ๋๋ค. ํ์ดํ ํจ์์๋ props๋ฅผ parameter๋ก ๋ฐ์ผ๋ฉฐ props.props๋ช ์ ํ์ฉํฉ๋๋ค.
color ๋ถ๋ถ์ ๋ณด์๋ฉด, color ๋ผ๋ props์ ๊ฐ์ ๋ฐ์์ค๋ฉด ๋ฐ์์จ props.color๋ก ์คํ์ผ๋ง ํด์ฃผ๊ณ , ์ง์ ํด์ฃผ์ง ์์์ ๊ฒฝ์ฐ "red"๋ผ๋ ๊ฐ์ผ๋ก ์คํ์ผ๋ง ํด์ค๋๋ค.(๋ ผ๋ฆฌ์ฐ์ฐ์ || OR์ ํ์ฉํฉ๋๋ค.)
App ์ปดํฌ๋ํธ์ 3๊ฐ์ Button ์ปดํฌ๋ํธ๋ฅผ ์ ์ฉํ๊ณ , color ๋ผ๋ props์ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ฐ์
์ ๋ฌํ์ ๋์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์๋ฌด๊ฐ๋ ์ ๋ฌํ์ง ์์์ ๊ฒฝ์ฐ -> OR ์ฐ์ฐ์ ||์ ์ํด "red"๋ก ์คํ์ผ๋ง
1. "blue"๋ฅผ ์ ๋ฌํ์ ๊ฒฝ์ฐ -> "blue"๋ก ์คํ์ผ๋ง
1. "green"์ ์ ๋ฌํ์ ๊ฒฝ์ฐ -> "green"์ผ๋ก ์คํ์ผ๋ง
5. CSS๋ฅผ ์ถ๊ฐํ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง
์ผ๋ฐ CSS๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด๋ถ ์คํ์ผ๋ง์ ํด์ํ ๋๋ CSS๋ฅผ ๋ถ๋ฌ์์ผ ํฉ๋๋ค.
๋ค์, AND ์ฐ์ฐ์ &&๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น props ๊ฐ๋ง ๊ฐ์ง๋ ์ปดํฌ๋ํธ ์คํ์ผ๋ง์ ํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด, size ๋ผ๋ props์ ๊ฐ์ ๊ฐ์ง ์ปดํฌ๋ํธ๋ง ํฌ๊ธฐ๊ฐ 2๋ฐฐ๋ก ์ปค์ง๋๋ก ํ๋ ํจ์๋ฅผ ์์ฑํด
๋ด๋ถ์ css ์คํ์ผ๋ง์ ํฉ๋๋ค.
์๋์ ๊ฐ์ด ์ปดํฌ๋ํธ ๋ถ๋ถ์ ์ฌ๋ฌ props๋ฅผ ํ๋ผ๋ฏธํฐ์ ์ ๋ฌํ๊ณ ์กฐํํ ๋๋
rest์ spread ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์ฒ์์๋ styled-components๊ฐ ๋ณต์กํด๋ณด์ด๊ธฐ๋ ํ๊ณ ์ง๊ธ ์ ์ฉํ๊ณ ์๋ ๋ฐฉ๋ฒ์ด ํฌ๊ฒ ๋ฒ๊ฑฐ๋กญ์ง ์์ ๊ด๋ จ ๊ธฐ์ ์ ์คํตํ๋ ค๊ณ ํ์ต๋๋ค.(์ปดํฌ๋ํธ ์คํ์ผ๋ง์ ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์์ผ๋๊น์.) ๊ทธ๋ฐ๋ฐ ์ต๊ทผ์ ์ธํด ๊ณต๊ณ ๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ ์๊ฒฉ ์๊ฑด์ CSS in JS ์ฌ์ฉ ๊ฒฝํ์ ์๊ตฌํ๋ ํญ๋ชฉ์ด ์์๊ณ , ์๊ฐํ๋ ค๋ ๋ฆฌ์กํธ ๊ด๋ จ ๊ฐ์์์๋ CSS in JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ(emotion)์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
๊ทธ๋์ '์ด์ ์ด๋ ๊ฒ ๋๊ฑฐ ์์๋์'๋ผ๋ ๋ง์์ผ๋ก ํ ๋ฒ ์ ๋ฆฌํด๋ณด์์ต๋๋ค. ๋น๋ก ์ง๊ธ ๋น์ฅ ์ฌ์ฉํ์ง ์๋๋ผ๋ ์ด๊ธฐ ์ธํ ์ด๋ ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ธฐ๋กํด๋๋ฉด ๋์ค์ ์ฌ์ฉํ๋ ์๊ฐ์ด ์์ ๋ ์ฐพ์๋ณผ ์ ์์ด์ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ ์ด๋ ๊ฒ ๋๊ฑฐ, ๋๋ฅผ ์ํด์ ํ๋ ์ผ์ด ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ์ข์ ์ํฅ์ ๋ฏธ์ณค์ผ๋ฉด ํ๋ ๋ฐ๋์ ๋๋ค.๐ ์ค๋๋ happy hacking ํ์ธ์!
'๐งโ๐ป๊ฐ๋ฐ_Deep Dive > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
antd์ styled-components ๊ฐ๋จ ์ ์ฉ (0) | 2022.02.08 |
---|---|
[๋ฆฌ์กํธ] CRA ์์ด ๋ฆฌ์กํธ ํ๊ฒฝ ๊ตฌ์ถํด๋ณด๊ธฐ (0) | 2022.02.04 |
[๋ฆฌ์กํธ] ์ปดํฌ๋ํธ์ props ~ ์ํ ๋์ด์ฌ๋ฆฌ๊ธฐ (0) | 2022.02.03 |