๐คท๐ปโ๏ธ ์ผ๋ฐ CSS๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Emotion์ ์ฌ์ฉํ๋ ์ด์ ๋?
JavaScript๋ก CSS ์คํ์ผ์ ์์ฑํ๊ธฐ์ ํธํ๊ฒ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ด๋ค.! (css-in-js)
๐คท๐ปโ๏ธ ๊ทธ๋ ๋ค๋ฉด Emotion ๋ฟ์ธ๊ฐ?
No! [styled components] ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์.
npm trends์์ ์ง๋ 6๊ฐ์๊ฐ ๋ค์ด๋ก๋ํ์๋ฅผ ์ดํด๋ณด๋ ์ฌ์ฉ๋ฅ ์ emotion์ด ์ข ๋ ๋์๋ค.
@emotion/styled์ ๋จผ์ ์์๋ณด์.
๐๐ป ์ค์น
// react์์ ์คํ์ผ API๋ก ์ง์ ํ๊ทธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ๋ ํจํค์ง
npm i @emotion/styled
yarn add @emotion/styled
๐๐ป ์ค์
emotion์ ์ ์ฉํ๊ธฐ ์ํด์๋ babel์ ์ค์ ์ ๋ฐ๊ฟ์ฃผ์ด์ผํ๋๋ฐ,
๋ง์ฝ react๋ฅผ CRA ํ๋ก์ ํธ๋ก ์์ํ๋ค๋ฉด eject์ ํด์ค ํ babel์ ์ค์ ํด์ค์ผ ํ๋ค.
CRA ํ๋ก์ ํธ์์๋ ๋ฐ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง ์์ ํ์ง๋ ์์ผ๋ ๊ฐ๋ฅํ๋ค๋ฉด .babelrc ์ค์ ์ ๊ถ์ฅ
- CRA Project
// plugin ์ฌ์ฉ์
npm install --save-dev @emotion/babel-plugin
yarn add --dev @emotion/babel-plugin
- Set .babelrc
{
"plugins": ["@emotion"]
}
๐๐ป Styled Components
React Component๋ฅผ ์ง์ Customํ์ฌ ์ฌ์ฉํ๊ธฐ!
props๋ฅผ ๋ฐ์ ์์ ๋ก์ง์ ์ค์ ํด์ค ์ ์๋ค.
import styled from '@emotion/styled';
const MyButton = styled.button`
color: ${props =>
props.primary ? 'hotpink' : 'skyblue'};
`;
render(
<Container>
<MyButton primary>This is My Button.</MyButton>
</Container>
)
props์ ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํด์ค ์ ์๋ค.
import styled from '@emotion/styled'
const SideTab = styled.div`
display: ${({isMobile}) => {
console.log(isMobile, "isMobile") // ๋ฐ์์จ isMobile์ boolean ๊ฐ ์ถ๋ ฅ
return isMobile ? 'none' : 'block'
}};
`;
const TestSideTab = styled.div(
{color: 'purple'},
props => ({fontSize: props.fontSize})
);
function SideTabComponent() {
const isMobile = useMediaQuery({maxDeviceWidth: 500}); // boolean
return (
<SideTab isMobile={isMobile}>
<TestSideTab fontSize="200">Hi</TestSideTab>
</SideTab>
)
}
๋ถ๋ชจ ํ๊ทธ์์ ์์ ํ๊ทธ์ ์์ฑ์ ๋ณ๊ฒฝ์์ผ์ค ์ ์๋ค. CSS ์ ์ฉ ์์์ ์ ์!
import styled from '@emotion/styled'
const MyButton = styled.button`
color: ${props =>
props.primary ? 'hotpink' : 'skyblue'};
`;
const Test = styled.div`
color: hotpink;
${MyButton} {color: green;};
& > button { // ์์์ button๋ง
margin: 5px;
border: none;
background-color: transparent;
color: aqua;
}
`;
function Compo() {
return (
<MyButton>My Color is skyblue</MyButton>
<Test>Hi I'm Test Component
<MyButton primary>My Color is green.</MyButton>
</Test>
)
}