[React] ContextAPI๋ฅผ ์ฌ์ฉํด์ TodoList๋ง๋ค๊ธฐ(1) : styled-components
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ ์์๋ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ์์ ๋ฅผ ๋ง๋ค์ด๋ดค์๋๋ฐ, ๊ทธ ๋์ ๋ค๋ฅด๊ฒ ์ด๋ฒ์๋ contextAPI๋ฅผ ์ด์ฉํด์ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
์์ง contextAPI์ ๋ํด์ ๋๊ตฌ์๊ฒ ์ค๋ช ํ ์ ์์๋งํผ ์ ๋ฆฌ๊ฐ ์๋์ด์๋ค๋ ์๊ฐ์ด ๋ค์ด์ ๋ค์ ์๋ก์ด ๋ง์์ผ๋ก ๊ณต๋ถ๋ฅผ ํด๋ดค๋ค.
๊ทธ๋์! ์ด๋ฒ ํฌ์คํธ์์๋ contextAPI์ ๋ํ ๊ฐ๋ ๋ค์ ๋ํด์ ์ค๋ช ํ๊ณ , ํฌ๋๋ฆฌ์คํธ ์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ค์ ์ ๋ฆฌํด๋ณผ ์๊ฐ์ด๋ค. contextAPI๋ฅผ ์ฌ์ฉํ ํฌ๋๋ฆฌ์คํธ ์์ ๋ ๋ฒจ๋กํผํธ๋์ ์ด ๊ธ์ ์ฐธ๊ณ ํด์ ์์ฑํ์ต๋๋ค.
๋จผ์ styled-components๋ฅผ ์ฌ์ฉํด์ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๊พธ๋ฉฐ์คฌ๋๋ฐ, ๊ฑฐ๊ธฐ์ ์ฌ์ฉ๋ ์คํ์ผ๋ง์์ ๋ด๊ฐ ์ ๋ชฐ๋๋ ๋ถ๋ถ๋ค์ ๋ํด ์ ์ด๋ณด๋ ค๊ณ ํ๋ค.
- createGlobalStyle : ์ด ๊ธฐ๋ฅ์ ํ์ด์ง ์ ์ฒด์ ํ์ ๋ฐฐ๊ฒฝ์์ ์ ์ฉํ ๋ ์ฌ์ฉ๋์๋ค.
const GlobalStyle = createGlobalStyle`
body {
background: #e9ecef;
}
`;
createGlobalStyle๋ก ๊ธ๋ก๋ฒํ๊ฒ ์ ์ฉ๋ ์คํ์ผ์ค ์์ ์ฝ๋๋ body์ background์ ์๊น์ ์ง์ ํด์ฃผ์๋ค.
- overflow-y : auto;
const TodoListBlock = styled.div`
flex: 1;
padding: 20px 32px;
padding-bottom: 48px;
overflow-y: auto;
`;
y์ถ ๋ฐฉํฅ์ผ๋ก ๊ธธ์ด๊ฐ ๋์ณค์ ๋, ์๋์ผ๋ก ์คํฌ๋กค์ด ์๊ธฐ๋ ๊ธฐ๋ฅ(์ฆ, ๋ด์ฉ์ด ๋์น ๋๋ง ์ธ๋ก ์คํฌ๋กค์ ์ ๊ณตํด์ฃผ๋ ๊ฒ)
- flex : 1;
flex : 1์ ์์ ์ฝ๋์ ๊ฐ์ ๊ณณ์์ ์ฐ์ด๊ณ ์์ด์ ๋ฐ๋ก ์ด์ ๋ํ ์์๋ ์ ๊ณตํด๋์ง ์์๋ค.
flex๋ ํ๋์ ํ๋ ์ค ์์ดํ ์ด ์์ ์ ์ปจํ ์ด๋๊ฐ ์ฐจ์งํ๋ ๊ณต๊ฐ์ ๋ง์ถ๊ธฐ ์ํด ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์์ฑ์ด๋ค.
flex : ์ด๊ณณ์ ์ฐ๋ ๊ฒ๋ค์ ๋ค ์ฐจ๋ก๋ก grow, shrink, basis๋ฅผ ๋ปํ๋๋ฐ flex : 1์ ์ซ์๊ฐ ํ๋์ด๊ณ , ๋จ์๊ฐ ์์ผ๋ฏ๋ก flex-grow๊ฐ 1์ด๋ผ๋ ๋ป์ด๋ค.
๋ฐ๋ผ์, ์ ํด์ง ํ์ ํฌ๊ธฐ์ ๋ง๊ฒ flex์ ํด๋นํ๋ ์์ดํ ์ ํฌ๊ธฐ๊ฐ ๋น์จ 1์ ๋ง๊ฒ ์ปค์ง๋ค๋ ๋ป์ธ๊ฒ๊ฐ๋ค.
- display : flex;
const TodoTemplateBlock = styled.div`
width: 512px;
height : 768px;
position: relative;
background: white;
border-radius : 16px;
box-shadow : 0 0 8px 0 rgba(0,0,0,0.04);
margin: 0 auto;
margin-top : 96px;
margin-bottom: 32px;
display: flex;
flex-direction: column;
`;
flexbox๋ ์ด์์์ ๊ตฌ์ฑํ ๋ ๊ทธ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ธ๋ ๋ถ๋ชจ์์์ธ ์ปจํ ์ด๋์ display : flex;๋ฅผ ์ง์ ํด์ค๋ค.
๋ฐ๋ผ์ ์์ ๊ฐ์ด flex: 1;๊ณผ ๊ฐ์ flexbox๋ฅผ ๊พธ๋ฏธ๊ธฐ ์ํด์๋ display: flex;๋ฅผ ๋ถ๋ชจ์์์ ๋ฃ์ด์ค์ผํ๋ค.
- ๋ฒํผ 45๋ ํ์ ํ๋ฉด์ ์ ๋ฐ๊พธ๊ธฐ
transition: 0.125s all ease-in;
${props =>
props.open &&
css`
background: #ff6b6b;
&:hover {
background: #ff8787;
}
&:active {
background: #fa5252;
}
transform: translate(-50%, 50%) rotate(45deg);
`}
์ฌ๊ธฐ์ ${๋ณ์๋ช }์ ํํ์์ฝ์ EL(Expression Language)๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋๋ฐ, ์ด ์ฝ๋์์๋ props๋ฅผ ๋ฐ๋๋ฐ ๊ณผ์ฐ ์ด props๋ ์ด๋ค props๋ฅผ ๋ฐ๋ ๊ฒ์ผ๊น?
์ด๋ ๋ฐ๋ props์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์คํ์ผ์ ์ ๊ณตํ๋๋ก ๋ง๋ค์ด์ฃผ๋ styled-components์ ๊ฐ๋ณ์คํ์ผ๋ง์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์, open prop์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง css๋ก ์ ์๋ ์คํ์ผ์ด ์ ์ฉ๋๋๋ก ๋ง๋ ์ฝ๋์ด๋ค.
๊ทธ๋ฆฌ๊ณ , transition๊ณผ transform์ ํตํด์ ์ ๋๋ฉ์ด์ ์ ์ฝ์ ํ์๋ค.
๋ฐ๋ผ์, ๋ฒํผ์ ํด๋ฆญํ๋ฉด 0.125์ด๋์ 45๋ ๊ธฐ์ธ์ด๋ ์ ๋๋ฉ์ด์ ์ ์๋์ํค๋ ์ฝ๋์ด๋ค
- position : absolute;
position์ ๋ฌธ์์์ ์์๋ฅผ ๋ฐฐ์นํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ์์ฑ์ด๋ค.
์ฌ๊ธฐ์ position์ผ๋ก ๋์ ์ ์๋ ๋ง์ ์์๋ค์ด ์์ฑ๋์ด์์ผ๋ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
๋๋ ์ผ๋จ ์ฝ๋์ ์์ฑ๋์ด์๋ absolute์ ๋ํด์๋ง ๋ค๋ค๋ณผ ๊ฒ์ด๋ค.
absolute๋ static์ ์์ฑ์ ์ง๋๊ณ ์์ง ์์ ๋ถ๋ชจ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ง์ธ๋ค.
relative, absolute, fixed๋ฑ์ ๋ค๋ฅธ ํ๊ทธ๊ฐ ์๋ค๋ฉด ๊ฐ์ฅ ์์ ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๋๋ค.