๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/REACT

[React] ContextAPI๋ฅผ ์‚ฌ์šฉํ•ด์„œ TodoList๋งŒ๋“ค๊ธฐ(1) : styled-components

by mingzoo 2021. 1. 31.

๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ์—์„œ๋Š” ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๋ดค์—ˆ๋Š”๋ฐ, ๊ทธ ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ ์ด๋ฒˆ์—๋Š” 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์„ ํ†ตํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฝ์ž…ํ•˜์˜€๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ1 ์ฐธ๊ณ ์ž๋ฃŒ2

๋”ฐ๋ผ์„œ, ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด 0.125์ดˆ๋™์•ˆ 45๋„ ๊ธฐ์šธ์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž‘๋™์‹œํ‚ค๋Š” ์ฝ”๋“œ์ด๋‹ค

 

  • position : absolute;

position์€ ๋ฌธ์„œ์ƒ์— ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•˜๋Š” ์†์„ฑ์ด๋‹ค.

์—ฌ๊ธฐ์— position์œผ๋กœ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์š”์†Œ๋“ค์ด ์ž‘์„ฑ๋˜์–ด์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

๋‚˜๋Š” ์ผ๋‹จ ์ฝ”๋“œ์— ์ž‘์„ฑ๋˜์–ด์žˆ๋Š” absolute์— ๋Œ€ํ•ด์„œ๋งŒ ๋‹ค๋ค„๋ณผ ๊ฒƒ์ด๋‹ค.

absolute๋Š” static์˜ ์†์„ฑ์„ ์ง€๋‹ˆ๊ณ  ์žˆ์ง€ ์•Š์€ ๋ถ€๋ชจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์›€์ง์ธ๋‹ค.

relative, absolute, fixed๋“ฑ์˜ ๋‹ค๋ฅธ ํƒœ๊ทธ๊ฐ€ ์—†๋‹ค๋ฉด ๊ฐ€์žฅ ์œ„์˜ ํƒœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š”๋‹ค.

 

 

728x90