๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] styled-components ๋กœ CSS ์Šคํƒ€์ผ๋งํ•˜๊ธฐ

by Connecting-the-dots 2022. 3. 25.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ styled-components ์„ค์น˜ํ•˜๊ธฐ

  • Component ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์Šคํƒ€์ผ๋ง์„ ํ•˜๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค์†Œ ๋ถˆํŽธํ•จ์ด ์ƒ๊ธฐ๊ธฐ๋„ ํ•œ๋‹ค.
    • class ๋ฅผ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ์„ ๊นŒ๋จน๊ณ  ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค.
    • ๊ฐ‘์ž๊ธฐ ๋‹ค๋ฅธ ์ด์ƒํ•œ Component ์— ์›ํ•˜์ง€ ์•Š๋Š” ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ๋‹ค.
    • CSS ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๊ธธ์–ด์ ธ์„œ ์ˆ˜์ •์ด ์–ด๋ ต๋‹ค.
  • ๊ทธ๋ž˜์„œ styled-components ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ฉด Component ๋ฅผ ์ œ์ž‘ํ•  ๋•Œ ์Šคํƒ€์ผ์„ ๋ฐ”๋กœ ์ž…ํ˜€์„œ Component ๋ฅผ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์„ ์ค„์ผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๐Ÿค styled-components ์„ค์น˜ํ•˜๊ธฐ

// npm ์„ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
npm install styled-components

// yarn ์ด ์„ค์น˜๋œ ๊ฒฝ์šฐ
yarn add styled-components
  • ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์œ„ ์ฝ”๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋œ๋‹ค.
import styled from 'styled-components';
  • ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ ์ตœ์ƒ๋‹จ์— ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ styled ๋ฅผ import ํ•ด์˜จ๋‹ค.

๐Ÿ’œ styled-components ์‚ฌ์šฉํ•˜๊ธฐ

  • styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ€์ผ์„ ๋ฏธ๋ฆฌ ์ž…ํžŒ Component ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๊ธธ์–ด์„œ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import styled from 'styled-components';

let Box = styled.div`
  margin: 10px;
  padding: 20px 0;
`

let Title = styled.h1`
  font-size: 40px;
  font-weight: bold;
  color: #484848;
`

function Detail(props) {

  return (
    <div className="container">
      <Box>
        <Title>Detail</Title>
      </Box>
    </div>
  )
}
  • ์œ„ ์ฝ”๋“œ์—์„œ div ํƒœ๊ทธ์— ์Šคํƒ€์ผ์„ ์ž…ํ˜€ Box ๋ผ๋Š” Component ๋ฅผ, h1 ํƒœ๊ทธ์— ์Šคํƒ€์ผ์„ ์ž…ํ˜€ Title ์ด๋ผ๋Š” Component ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • ํŠน์ • ํƒœ๊ทธ์— ์Šคํƒ€์ผ์„ ์ž…ํ˜€์ฃผ๊ณ  ์‹ถ์œผ๋ฉด styled.ํƒœ๊ทธ ์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์˜ค๋ฅธํŽธ์— ๋ฐฑํ‹ฑ( ` ) ๊ธฐํ˜ธ๋ฅผ ๋”ฐ์˜ดํ‘œ์ฒ˜๋Ÿผ ๋„ฃ์–ด ๊ทธ ์‚ฌ์ด์— ์›ํ•˜๋Š” ์Šคํƒ€์ผ์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์™„์„ฑ๋œ ์Šคํƒ€์ผ์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋ฉด ๋ณ€์ˆ˜๋ช…์ด ๊ณง Component ๊ฐ€ ๋œ๋‹ค.
  • ์ฐธ๊ณ ๋กœ Component ๋ฅผ ๋งŒ๋“ค์–ด์ค€ ๊ฒƒ์ด๋ฏ€๋กœ Box, Title ๊ณผ ๊ฐ™์ด ๋งจ ์•ž์˜ ๊ธ€์ž๋Š” ์˜์–ด ๋Œ€๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

 

  • ์ด๋ ‡๊ฒŒ ์Šคํƒ€์ผ์„ ์ž…ํ˜€๋†“์€ Component ๋ฅผ html ์ฝ”๋“œ ์‚ฌ์ด ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ์–ด์ฃผ๋ฉด ์œ„์™€ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’œ props ๋กœ ์Šคํƒ€์ผ๋งํ•˜๊ธฐ

  • ๋””์ž์ธ์„ ํ•˜๋‹ค๋ณด๋ฉด ๊ฐ€๋” ๋น„์Šทํ•œ UI ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • ์ด ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒŒ ๋ฐ”๋กœ props ๋กœ ์Šคํƒ€์ผ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ฝ”๋“œ์˜ ๋‚ด์šฉ์ด ๊ธธ์–ด์„œ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import styled from 'styled-components';

let Box = styled.div`
  margin: 10px;
  padding: 20px 0;
`

let Title = styled.h1`
  font-size: 40px;
  font-weight: bold;
  color: ${ props => props.color }
`

function Detail(props) {

  return (
    <div className="container">
      <Box>
        <Title color="red">Detail(RED)</Title>
        <Title color={"#484848"}>Detail(DARKGRAY)</Title>
      </Box>
    </div>
  )
}
  • ์˜ˆ๋ฅผ ๋“ค์–ด, Title ์ด๋ผ๋Š” Component ๋ฅผ ๋‹ค๋ฅธ CSS ์†์„ฑ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๊ธ€์ž์ƒ‰๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
  • ๊ทธ๋Ÿฌ๋ฉด Titile Component ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์ƒˆ๋กœ์šด Component ๋ฅผ ๋งŒ๋“  ํ›„์— color ์†์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” props ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•˜๋ฉด ํ›จ์”ฌ ๊ฐ„ํŽธํ•˜๊ณ  ๊น”๋”ํ•ด์ง„๋‹ค.

 

  •  props ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ์šฐ์„  color ์†์„ฑ์„ ๋„ฃ์–ด์ค€ ํ›„ ์ƒ‰์ƒ์„ ๊ธฐ์ž…ํ•˜๋Š” ๋ถ€๋ถ„์— ์ƒ‰์ƒ๋ช… ํ˜น์€ ์ƒ‰์ƒ์ฝ”๋“œ ๋Œ€์‹  ${ color => props.color } ๋ผ๋Š” code ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
    • ์šฐ์„ , ${ } ๋ผ๋Š” ๋ฌธ๋ฒ•์€ ๋ฌธ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฑํ‹ฑ ( ` ) ๊ธฐํ˜ธ ์•ˆ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ES6 ๋ฌธ๋ฒ•์ธ๋ฐ, ๋ฌธ์ž ์ค‘๊ฐ„์ค‘๊ฐ„์— ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์— props.color ๋ผ๋Š” props ๋ณ€์ˆ˜๋ฅผ ์ง‘์–ด๋„ฃ์œผ๋ฉด ๋˜๋Š”๋ฐ, ์ง‘์–ด๋„ฃ์„ ๋•Œ ${ props.color } ์˜ ํ˜•ํƒœ๋กœ ๋„ฃ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์œ„์™€ ๊ฐ™์ด ๊ผญ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

  • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ƒ‰์ƒ์„ ๊ธฐ์ž…ํ•˜๋Š” ๋ถ€๋ถ„์— ๋“ค์–ด๊ฐˆ ์ƒ‰์ƒ๋ช… ํ˜น์€ ์ƒ‰์ƒ์ฝ”๋“œ๋Š” html ์— ์ž‘์„ฑ๋œ Component ์—์„œ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  • Title ์ด๋ผ๋Š” Component ๋“ค์„ ๋ณด๋ฉด color ๋ผ๋Š” ๋ณ€์ˆ˜์— ๊ฐ๊ฐ red, {'#484848'} ์ด๋ผ๋Š” ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ props ๋กœ ์ „์†กํ•˜๊ณ  ์žˆ๋‹ค.
  • ๊ทธ๋ƒฅ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉด ๋”ฐ์˜ดํ‘œ ์•ˆ์— ์ž‘์„ฑํ•˜๋ฉด ๋˜๊ณ , ๋ณ€์ˆ˜๋‚˜ ์ž๋ฃŒํ˜•์„ ๋‹ด๊ณ  ์‹ถ์œผ๋ฉด ์ค‘๊ด„ํ˜ธ ์•ˆ์— ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

  • ๊ทธ๋ž˜์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๋กœ ํ™•์ธํ•˜๋ฉด ๊ฐ๊ฐ ์Šคํƒ€์ผ์ด ์ž˜ ์ž…ํ˜€์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ styled-components ์žฅ์ 

  • ์Šคํƒ€์ผ์„ ๋„ฃ์„ ๋•Œ ๋‹ค๋ฅธ ํŒŒ์ผ์ด๋ž‘ Component ์ด๋ฆ„์ด ๊ฒน์ณ๋„ CSS ์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Component ์Šคํƒ€์ผ ์ˆ˜์ •์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ CSS ๊ฐ€ ์•„๋‹ˆ๋ผ Component ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์ˆ˜์ •์ด ์šฉ์ดํ•˜๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•