์ฒ์์ผ๋ก react๋ฅผ ๊ณต๋ถํ๊ณ ๋์ css ์ฌ์ฉ์ ์ต์์น ์๊ณ , ์์ง ํ๋ฆ์ ์ ๋๋ก ์ก์ง ๋ชปํ ์ํ์์ ๊ฐ๋ฐ์ ์ฐธ์ฌํ๊ฒ ๋์๋ค.
๊ทธ๋ ๊ธฐ์ component ์ด๋ฆ์ ์ด๋ป๊ฒ ์ ํ๋์ง๋ ์ ์์ง ๋ชปํด ํผ๋์ค๋ฌ์ ๋ค.
์ผ๋จ ํด๋ด์ผํ๋ค๋ ์๊ฐ, html, css, js ๋ชจ๋ ์ฒ์ ์์ํ๋ ๋งํผ ๊ฒฐ๊ณผ๋ฌผ์ด ์์ด์ผ ํ๋ค๋ ์๊ฐ์ ์ผ๋จ ๋ฐ์ด๋ค์๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋๋ก ์ธํด style ๊ฐ์ญ์ด ์ผ์ด๋๋ฒ๋ ธ๋ค...
๊ฒฐ๊ตญ ๋๋ ์ ์ ํ๋ก์ ํธ์ ์์ ๋ผ๊ฒ ๋์์ง๋ง ์ด๋ฒ ์ผ์ ํตํด style ๊ฐ์ญ์ด ๋ฌด์์ธ์ง ํ์คํ๊ฒ ์๊ฒ ๋์๊ณ ,
๋ค์๋ ๊ฐ์ ์ค์๋ฅผ ๋ฐ๋ณตํ์ง ์๊ฒ ๋ค๋ ๋ค์ง์ ํ๋ค.
๊ณต์ ๋ฐ์ styled components์ ๋ํ ๊ธ์ ๊ณต๋ถํ๊ณ , ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
styled components์ ํ์์ฑ
์ค๋ณต๋ ํด๋์ค๋ช ์ ๋ง๋ค๊ฒ ๋๋ฉด, ๋ค๋ฅธ ์ปดํฌ๋ํธ ์คํ์ผ์ ์ํฅ์ ์ค ์ ์๋ค.
๋ค๋ฅธ ๋ชฉ์ ์ ์ํด ๋ง๋ ํด๋์ค๊ฐ ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ง๋ค์ด์ง๋ฉด, ๊ฐ๊ฐ์ ๊ฐ์ญํ๊ฒ ๋์ด ์ํฅ์ ๋ผ์น๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ styled components ์ด๋ค.
Styled components
styled components๋ ํน์ ์คํ์ผ์ด ์ฒจ๋ถ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ ํจํค์ง์ด๋ค.
์ด ํจํค์ง๋ฅผ ์ ์ฉํ๋ฉด ํด๋น ์คํ์ผ์ด ์ฒจ๋ถ๋๋ ์ปดํฌ๋ํธ์๋ง ์ํฅ์ ๋ฏธ์น๊ณ , ๋ค๋ฅธ ๊ฒ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
styled components ์ฌ์ฉ ๋ฐฉ๋ฒ
1. styled components๋ฅผ npm ์ค์น ํ๋ค.
2. ์ฌ์ฉํ๋ ค๋ ์ปดํฌ๋ํธ์์ ํด๋น ํจํค์ง import
styled.ํ๊ทธ(๋ฐฑํฑ) ๊ณผ ๊ฐ์ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค. (styled.ํ๊ทธ`` )
๋ฐฑํฑ ๊ด๋ จ ๊ตฌ๋ฌธ์ tagged template literal์ด๋ผ๊ณ ํ๋ค๋๋ฐ,์ด ๋ถ๋ถ์ ๊ทธ๋ฅ ๋์ด๊ฐ๋ค.
(๋ฐฑํฑ์ ' (์์ ๋ฐ์ดํ)์ ๋น์ทํ๊ฒ ์๊ธด ๋ฌธ์์ด๋ค. ์ด๊ฒ์กฐ์ฐจ ๋ชฐ๋๋ ๋...)
styled๋ importํ๋ ๊ฐ์ฒด์ด๊ณ , ๊ทธ ์์ ๋ช ์ํ 'ํ๊ทธ'์ ๋ฉ์๋์ ์ ๊ทผํ ์ ์๋ค.
์ฆ, ๋ฐฑํฑ ์ฌ์ด์ ๋ค์ด๊ฐ ๋ถ๋ถ์ด ์ ๋ฌํ๋ ๊ฒ์ธ๋ฐ, ์ด ๋ฐฑํฑ ์ฌ์ด์ ์๋ ๊ฒ์ด ๊ฒฐ๊ตญ ํด๋น ๋ฉ์๋๋ก ์ ๋ฌ๋๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ํ๊ทธ ๋ฉ์๋๊ฐ ์๋ก์ด ํ๊ทธ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ค๊ณ ํ๋ค.
๊ธ์ ๊ณ์ ์ฝ๋ค ๋ณด๋ styled components๋ ์ด๋ป๊ฒ ๋ง๋ค์ด์ง๋์ง ๊ถ๊ธํ๋ค.
์ด๋ฆ์ ์ด๋ค ์์ผ๋ก ์์ฑํ๋๊ฑด์ง, ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ๋ง๋๋์ง ์๋ฌธ์ด ์๊ฒผ๋ค.
-> styled components๋ก ๋ง๋ค์ด์ง ๊ฒ๋ค์ class ๋ช ์ ํด๋น ํจํค์ง์ ์ํด '๋์ '์ผ๋ก ์์ฑ์ด ๋๋ค.
-> ๋ชจ๋ ํด๋์ค๋ ๊ณ ์ ํ ์ด๋ฆ์ ๊ฐ๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
styled components์์ css pseudo ์ ํ์ ๋ฐ ์ค์ฒฉ ์ ํ์
์ด ๋ถ๋ถ์ ์ ๋ฆฌํ๊ธฐ ์ ์ css pseudo ์ ํ์์ ๋ํด ์กฐ๊ธ ์๊ณ ์ถ์๋ค.
pseudo๋ ๋ณดํต ๊ฐ์์ธ ๊ฒ์ ์ด๋ฆ์ด ๋ถ๋๋ฐ, ์ด ๋ํ ๊ทธ๋ฌํ๋ค. ์ฐ๋ฆฌ ๋ง๋ก๋ '๊ฐ์ ์ ํ์'๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
css pseudo ์ ํ์๋ html์์๋ฅผ ์ง์ ์ ์ผ๋ก ์ ํํ์ง ์๊ณ ์์์ ์ํ์ ๋ฐ๋ผ ์ ํํ์ฌ ๊พธ๋ฉฐ์ฃผ๋ ๊ฒ์ ์๋ฏธํ๋ค.
css pseudo ์ ํ์์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ ์ด ๊ธ์์ ๋ฐฐ์ธ ์ ์๋ค. (https://bio-info.tistory.com/67)
๋ค์ ๋์์ styled components์์ css pseudo ์ ํ์ ๋ฐ ์ค์ฒฉ ์ ํ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๊ฒฝ์ฐ, & ์ด๋ ๊ฒ ์๊ธด ๊ธฐํธ๋ฅผ ์ฌ์ฉํ๋ค. &:hover ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
์ค์ฒฉ ์ ํ์์ ๊ฒฝ์ฐ, & label ํน์ &.invalid์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
& ๊ธฐํธ๋ ์์ฑ๋ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐํ๋ค.
styled components์์ props ์ ๋ฌํ๊ธฐ
styled components์ props๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐฑํฑ ์์์ ๊ทธ props๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์คํ์ผ์ ๋์ ์ผ๋ก ์ฝ๊ฒ ๋ฐ๊ฟ ์ ์๋ค.
์ด๋ ๋ฐฑํฑ ์ฌ์ด์ $ ๊ธฐํธ์ ์ค๊ดํธ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ด ์๋ก ๋ค๋ฅธ ์ธ ๊ฐ์ง ๋ฐฉ์์ ํตํด ๋ํ๋ผ ์ ์๋ค.
<CircleStyled invalid={true}/>
// case 1
const CircleStyled = styled.div`
border-radius: 100%;
background-color: ${({ invalid }) => invalid ? 'red' : 'black'};
`;
// case 2
const CircleStyled = styled.div(({ invalid ) => `
border-radius: 100%;
background-color: ${invalid ? 'red' : 'black'};
`);
// case 3
const CircleStyled = styled.div`
${({ invalid }) => `
border-radius: 100%;
background-color: ${invalid ? 'red' : 'black'};
`}
`);
styled component์์ ๋ฏธ๋์ด ์ฟผ๋ฆฌ
๋น์ํ์ ์ํด ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฅผ styled component์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด ๋๋ @media์ ์ ์กฐ๊ฑด์ (min-width: 700px)์ฒ๋ผ ์ ๊ณ , ํด๋น ์ค๊ดํธ ์์ ์กฐ๊ฑด์ ๋ง์กฑํ ์ ์ ์ฉ๋ ์คํ์ผ์ ์ ๋๋ค.
const Button = styled.button`
width: 100%;
@media (min-width: 700px) {
// ๋ธ๋ผ์ฐ์ ํญ์ด 700px ์ด์์ธ ๊ฒฝ์ฐ์ ์ ์ฉ๋๋ ์ฝ๋
width: auto;
}
`
์ด๋ ๊ฒ styled component์ ๋ํ ๋ค์ ๊ธ์ ์ฝ๊ณ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํด ๋ณด์๋ค.
์ด์ ๋ ์กฐ๊ธ ๋ ์ต์ํ๊ฒ, ํ๋ฆ์ ํ์ ํ์ฌ ์ฆ๊ฒ๊ฒ ์ฝ๋ฉํ๊ณ ์ถ๋ค...
(์น์ ๋๋ฌด ๋ง๋งํ๊ฒ ๋ดค๋ ๋... ๋ฐ์ฑํด...)
'๐ฅ๏ธ react' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[react] ThemeProvider ์ฌ์ฉํ๊ธฐ (0) | 2024.01.20 |
---|---|
[react] dropdown ๋ง๋ค๊ธฐ (์์ด์ฝ, ๋๋กญ๋ค์ด) (0) | 2024.01.17 |
[react] react-dropdown ์ปค์คํ ํ๊ธฐ (0) | 2024.01.15 |
[react] markdown editor, viewer ๊ตฌํํ๊ธฐ (2) | 2023.01.29 |
[react] useEffect() (0) | 2022.12.27 |