๐๏ธ๊ธฐ๋ก์ฉ Velogโ
โป ์์ธํ ์ค๋ช
์ ๊ตฌ๊ธ๋ง ๋ค๋ฅธ ๋ถ๋ค ์ฐธ๊ณ โ๏ธ
css ํ์ผ์ ์ฌ์ฉํ์ง ์๊ณ React ์ปดํฌ๋ํธ ๋ด์์ ์คํ์ผ์ ์์ฑํ ์ ์๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ๏ธ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์๋ง ์ ์ฉ ๋ค๋ฅธ ๊ณณ ์ํฅ ๊ฑฑ์ X
โ๏ธ props๋ฅผ ํ์ฉํ ์กฐ๊ฑด๋ถ ์ฌ์ฉ, ์ฌํ์ฉ
โ๏ธ ๋ณํ์ง ์๋ ๊ณ ์ ๋ ๊ฐ ์์๋ฅผ ๊ณต์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
โ๏ธ ๋ค์ด๋ฐ์ ํธํ๊ฒ ์์ฑํ ์ ์๋ค.
โ๏ธ styled-components ์ปดํฌ๋ํธ ๊ตฌ๋ถ ๋ฐ ์ถ์ ์ด ์ด๋ ต๋ค.
โ๏ธ ๊ธฐํ ๋ฑ ๐
npm install styled-components
โ๏ธ import styled
โ๏ธ styled components ์์ฑ ์ ์ปดํฌ๋ํธ์ด๊ธฐ์ ์ฒซ๊ธ์ ๋๋ฌธ์!
โ๏ธ SCSS ์ฌ์ฉํ๋ฏ์ด ์์ฑ ๊ฐ๋ฅ.
๐ EX) const StyledComponents = styled.h1
โ๏ธ styled.์ฌ์ฉํ ํ๊ทธ(css ์ ์ฉํ ํ๊ทธ)
๐ EX) styled.div / styled.h1
import styled from 'styled-components'
// ๋๋ฌธ์๋ก ์์ํ๋ styled components
// styled.์ฌ์ฉํ๋ ํ๊ทธ`(๋นฝํฑ๊ธฐํธ) css ์
๋ ฅ `;
const StyledComponents = styled.div`
// ๐CSS ์์ฑ
background:#000;
`
function StyledTest(){
return (
<StyledComponents>
๋ฐฐ๊ฒฝ์ #000 div ์๋ฃ!!
</StyledComponents>
)
}
export default StyledTest;
โ๏ธ ๋ง๋ค์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ( ) ๊ดํธ๋ก ์์ ๋ฐ์์ ์ฌํ์ฉํ ์ ์์ต๋๋ค.
import styled from 'styled-components'
const SpanYellow = styled.div`
background:yellow;
color:#000;
`;
const Box1 = styled(SpanYellow)`
width:100px;
height:100px;
`;
const Box2 = styled(SpanYellow)`
width:200px;
height:200px;
color:red;
`;
const Box3 = styled(SpanYellow)`
width:200px;
height:200px;
background:green;
color:#fff;
`;
function StyledComponents1 () {
return (
<>
<Box1>Box1 ์
๋๋ค.</Box1>
<Box2>Box2 ์
๋๋ค.</Box2>
<Box3>Box2 ์
๋๋ค.</Box3>
</>
)
}
โ๏ธ .์จ์ ๋์ ( ) ๊ดํธ๋ฅผ ์ฌ์ฉํ๋ค.
โ๏ธ css๋ฅผ ์์๋ฐ๊ณ ์ถ๊ฐ๋ก ์์ฑํ ์ ์๋ค.
โ๏ธ ๋ง์ฝ ๊ฐ์ ์์ฑ์ ์ฌ์
๋ ฅํ ๊ฒฝ์ฐ ๋ฎ์ด์๊ฒ ๋๋ค.
styled.button.attrs({์์ฑ})
โ๏ธ .attrs๋ฅผ ์ฌ์ฉํ๋ค.
EX) ๋ฒํผ์ ๊ฒฝ์ฐ
const Button1 = styled.button`
background:#000;
color:#fff;
`;
//
<Button1>๋ฒํผ์
๋๋ค.</Button1>
// โ
.attrs ์ฌ์ฉ
const Button2 = styled.button.attrs({
// ์ฌ๊ธฐ์ ์์ฑ ์
๋ ฅ
type:'button'
})`
background:#000;
color:#fff;
`;
//
<Button2>๋ฒํผ์
๋๋ค.</Button2>
โ๏ธ โ๏ธ์์ฑ์ ์ ๋ ฅํ ์ ์๋ค.
โ๏ธ styled.์ง์ ๋ ํ๊ทธ๋ฅผ ๊ฐ์ css ์คํ์ผ๋ก ๋ค๋ฅธ ํ๊ทธ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด!?
as="๋ณ๊ฒฝ ํ๊ทธ"
const BorderBox = styled.div` // div
width:100px;
height:100px;
margin:20px;
border:1px solid #ddd;
`
const CircleText = styled.p` // p
&::before {
content:'\\22C5';
}
`
///////
<BorderBox>
<CircleText>ํ
์คํธ</CircleText>
</BorderBox>
<BorderBox as="ul"> ๐ ul ๋ณ๊ฒฝ
<CircleText as="li"> ๐ li ๋ณ๊ฒฝ
ํ
์คํธ
</CircleText>
</BorderBox>
โ๏ธ ๊ฐ์ ์คํ์ผ๋ก ํ๊ทธ๋ง ๋ค๋ฅด๊ฒ ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
โ๏ธ props๋ฅผ ํตํด ๊ฐ์ ๋ฐ์ ์ฌ์ฉ ๋ฐ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์คํ์ผ์ ์ง์ ํ ์ ์๋ค.
// ๊ธฐ๋ณธ ์์ฑ๋ฒ
${props => props.๋ฐ์์จ๊ฐ }
// ๐ EX)
color:${props => props.color || #000000 };
โ ํ ์คํธ
import styled from 'styled-components'
// โ
props
// ์ฝ๋ ํ์ธ ๋ฐ ๋ณต์ฌ์ฉ
const PropsStyled = styled.div`
margin:20px;
background:${props => props.bg || 'pink'};
${props=> props.border && `
border: ${props.border};
`};
color:${props=> props.color || 'white'};
`
function StyledComponentsTest () {
return (
<>
<PropsStyled>
๊ธฐ๋ณธ
</PropsStyled>
<PropsStyled color={"green"} bg={"black"}>
color:black
background:green
</PropsStyled>
<PropsStyled color={"red"} bg={"yellow"} border={"1px solid #000"}>
color: red
background:yellow
</PropsStyled>
</>
)
}
export default StyledComponentsTest;
${props => props.bg || 'default'}
โ๏ธ ||์ ์ฌ์ฉํ์ฌ props.bg๊ฐ ์์ ๊ฒฝ์ฐ bg ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ๊ฒฝ์ฐ์ default ๊ฐ์ ์
๋ ฅํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ๏ธ background,color์ ๊ฒฝ์ฐ ์
๋ ฅ๋ ์ํ์์ props๊ฐ ๋๋ default ๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋์ด ์์ต๋๋ค
โ๏ธborder์ ๊ฒฝ์ฐ props.border ์๋ ๊ฒฝ์ฐ์๋ง border ์์ฑ์ ์ฌ์ฉํ๋๋ก ํ ์ ์์ต๋๋ค.
โ๏ธ ๐๊ฒฐ๊ณผ๋ฌผ
โ ๏ธ color, bgColor ๋ฑ ๋ค๋ฅธ ์๋ชป๋ ๋ค์ด๋ฐ์ผ๋ก ์ ๋ ฅ ์ ์๋์ ๊ฐ์ ๊ฒฝ๊ณ ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋๋ ๐
๐ ๊ฒฝ๊ณ ๋ฌธ ํด๊ฒฐ
โ ๏ธ $(prefix) ๋ถ์ฌ์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๊ณ ๋ฌธ์ด ์ฌ๋ผ์ง๋ค.
// parent.jsx
const ParentWrap = styled.div`
width:150px;
height:150px;
margin:20px;
border:1px solid #ddd;
`;
function PropsStyledChildren(){
return (
<ParentWrap>
{/* EX) ๐์์ ์ปดํฌ๋ํธ์๊ฒ ๋ฐฐ๊ฒฝ์๊ณผ border ์ ๋ฌ */}
<ChildrenStyled $bg={"blue"} $border={"1px solid green"} />
</ParentWrap>
)
}
//children.jsx
const ChildrenWrap = styled.div`
width:100px;
height:100px;
margin:20px;
${props => `
${props.$bg && `background: ${props.$bg};`}
${props.$border && `border: ${props.$border};`}
`}
color:#fff;
`;
// โ
๋ฐฉ๋ฒ 1 - $bg, $border ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
function ChildrenStyled({$bg, $border}){
return (
<ChildrenWrap $bg={$bg} $border={$border}>
<p>zz</p>
</ChildrenWrap>
)
}
// โ
๋ฐฉ๋ฒ 2 - ...props
function ChildrenStyled({...props}){
return (
<ChildrenWrap {...props}>
<p>TEST</p>
</ChildrenWrap>
)
}
โ ์ ์ ์ถ๋ ฅ
โ๏ธ GlobalStyle ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ importํด์ ์ฌ์ฉํ๋ค.
โ๏ธCSS common.css ๋ง๋ค์ด ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉ ๊ฐ๋ฅ
โ import ํ์ธ!
// GolbalStyle.jsx ํ์ผ ์์ฑ
import { createGlobalStyle } from 'styled-components'
// โ
Global TEST์
๋๋ค
const GolbalStyle = createGlobalStyle`
* {margin:0; padding:0}
.App {
div {
width:100px;
height:100px;
border:1px solid #ddd;
}
p{
font-size:14px;
color:red;
}
}
`;
export default GolbalStyle;
โ ๊ธ๋ก๋ฒ ์คํ์ผ ์ ์ฉํ ํ ์คํธ ์ปดํฌ๋ํธ
// StyledGlobalTest.jsx
function StyledGlobalTest (){
return (
<div>
<p>styled components - Global TEST</p>
</div>
)
}
export default StyledGlobalTest;
// App.js
function App() {
return (
<div className="App">
<GolbalStyle />
<StyledGlobalTest />
</div>
);
}
โ
GlobalStyle ์ปดํฌ๋ํธ ์ฌ์ฉ ๋
โ ๏ธ์์ ๊ฐ์ด ์ฌ์ฉ ์ ๊ฒฝ๊ณ ๋ฌธ๊ณผ ํจ๊ป ์ ์ฉ์ด ๋์ง ์๋๋ค.
โ
GobalStyle ๋ค๋ฅธ ์ปดํฌ๋ํธ ์ฌ์ด์ ์ฌ์ฉํด๋ ์ ์๋์
css๋ฅผ import ํ๋ฏ์ด GolbalStyle ์ปดํฌ๋ํธ ์ฌ์ฉ์ ๋ถ๋ชจ ์์ ์ปดํฌ๋ํธ ์ ์คํ์ผ์ด ์ ์ฉ๋๋ ๊ฒ์ ํ์ธ
๊ธฐ๋ก ๋.
๊ฐ์ฌํฉ๋๋ค. ๐