Front/React.js

[React] ๋ฆฌ์•กํŠธ styled-components

ddo04 2024. 8. 20. 15:21
728x90
15. ๋ฆฌ์•กํŠธ styled-components

๐Ÿคฏ ๋ฆฌ์•กํŠธ styled-components ์„ค์น˜

  • ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ ๋ฆฌ์•กํŠธ style-components ์„ค์น˜
# npm์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

npm install --save styled-components

# yarn์‘ใ„น ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

yarn add styled-components

  • ์Šคํƒ€์ผ์ด ์ž˜ ์ ์šฉ๋˜์—ˆ๋‹ค๋ฉด ํšŒ์ƒ‰ ๋ฐฐ๊ฒฝ์— ํฐ์ƒ‰ ๊ธ€์”จ๋กœ ์•ˆ๋…• ๋ฆฌ์•กํŠธ๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ™”๋ฉด์ด ๋“ฑ์žฅ

  • ๋ฆฌ์•กํŠธ styled-components์˜ MainPage.jsx ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ๊ผญ index.js ํŒŒ์ผ์—์„œ Mainpage๋ฅผ import ํ•ด์ฃผ์–ด์•ผ npm ์‹คํ–‰ ๋ช…๋ น์–ด์ธ npm start ์ž‘์„ฑ์‹œ ์‹คํ–‰ ๊ฐ€๋Šฅ

๐Ÿคฏ ๋ฆฌ์•กํŠธ styled-components ์‚ฌ์šฉ

  • ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ (styled-components) ๋Š” ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด(tagged template literal)์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ง€์ •
  • ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ• ์ค‘ ํ•˜๋‚˜
import React from "react";
import styled from "styled-components";

const Wrapper = styled.div`
	padding: 1em;
    background: grey;
`;
  • Styled ์ปดํฌ๋„ŒํŠธ๋Š” ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ CSS ์†์„ฑ์ด ์ ์šฉ๋œ React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์คŒ
  • Styled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฐฑํ‹ฑ(``)์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ๋ฌธ์ž์—ด ๋ถ€๋ถ„์— CSS  ์†์„ฑ์„ ๋„ฃ๊ณ  ํƒœ๊ทธํ•จ์ˆ˜ ์œ„์น˜์—๋Š” styled.html ํƒœ๊ทธ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ
  • ํ•ด๋‹น ์—˜๋ฆฌ๋จผํŠธ ํƒœ๊ทธ์— CSS ์†์„ฑ๋“ค์ด ์ ์šฉ๋œ ํ˜•ํƒœ์˜ React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง

๐Ÿคฏ ๋ฆฌ์•กํŠธ styled-components์˜ props ์‚ฌ์šฉ

  • styled ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์กฐ๊ฑด์ด๋‚˜ ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์Šคํƒ€์ผ๋งํ•˜๊ธฐ ์œ„ํ•ด props ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ props์™€ ๊ฐ™์€ ๊ฐœ๋…์œผ๋กœ ์ดํ•ดํ•˜๋ฉด ๋จ

  • styled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์˜ css ์†์„ฑ์„ ๋ณด๋ฉด ๋‚ด๋ถ€์— props๊ฐ€ ์‚ฌ์šฉ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Œ
  • props๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์— ์‚ฌ์šฉ๋œ props๋ฅผ ์˜๋ฏธ
  • ์‹ค์ œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด props๋กœ dark๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ์‹ค์ œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์— ๋“ค์–ด๊ฐ„ props๋Š” ๊ทธ๋Œ€๋กœ styled ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ
  • styled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์Šคํƒ€์ผ์„ ์ž์œ ์ž์žฌ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿคฏ ๋ฆฌ์•กํŠธ styled-components์˜ ์Šคํƒ€์ผ ํ™•์žฅํ•˜๊ธฐ

  • styled ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋จ
  • ์ƒ์„ฑ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถ”๊ฐ€์ ์ธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์—๋Š” styled ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ ํ™•์žฅ ๊ธฐ๋Šฅ ์‚ฌ์šฉ

  • ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” HTML์˜ ๋ฒ„ํŠผ ํƒœ๊ทธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋‹จ์ˆœํ•œ ๋ฒ„ํŠผ
  • ๋ผ์šด๋””๋“œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” HTML ํƒœ๊ทธ๊ฐ€ ๋น ์ ธ ์žˆ๊ณ  ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ฑ„๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • HTML ํƒœ๊ทธ๊ฐ€ ๋น ์ ธ ์žˆ๊ณ  ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ด„ํ˜ธ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ฑ„๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ์Šคํƒ€์ผ์ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ ํ™•์žฅํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๋ถ€๋ถ„
  • ๋ผ์šด๋””๋“œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ์„œ๋ฆฌ๋ฅผ ๋‘ฅ๊ธ€๊ฒŒ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ
  • ๋” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿคฏ ๋ฆฌ์•กํŠธ ๋ฆฌํ„ฐ๋Ÿด(literal)

  • ๋ฆฌํ„ฐ๋Ÿด์€ ์†Œ์Šค ์ฝ”๋“œ์— ๊ณ ์ •๋œ ๊ฐ’์„ ์˜๋ฏธ
  •  ์ƒ์ˆ˜์™€ ๋‘˜์€ ๋‹ค๋ฅธ ๊ฐœ๋…
let number = 20;
  • ๋Œ€์ž… ์—ฐ์‚ฐ์ž์˜ ์™ผ์ชฝ์—๋Š” number๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ๋“ฑ์žฅํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์—๋Š” ์ •์ˆ˜ 20์ด ๋“ฑ์žฅ
  • ์ •์ˆ˜ 20์€ number๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ์†Œ์Šค ์ฝ”๋“œ์— ๊ณ ์ •๋œ ๊ฐ’์„ ์˜๋ฏธ
// ์ •์ˆ˜ ๋ฆฌํ„ฐ๋Ÿด (Integer literal)
const myNumber = 10;

// ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด (String literal)
const myStr = "Hello";

// ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด (Array literal)
const myArray = [];

// ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด (Object literal)
const myObject = {};
  • ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ๋ฆฌํ„ฐ๋Ÿด์ด ๋‚˜์™€ ์žˆ์Œ
  • ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ var๋‚˜ let์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ์ปจ์Šคํ„ด์Šค(const)๋ฅผ ์‚ฌ์šฉ
  • ์ปจ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์ด ๋ชจ๋‘ ์ƒ์ˆ˜๊ฐ€ ๋จ
  • ์ƒ์ˆ˜๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ  ํ•œ ๋ฒˆ ์„ ์–ธ๋œ ์ดํ›„์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ
  • ๋Œ€์ž… ์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๊ฐ’๋“ค์ด ๋ชจ๋‘ ๋ฆฌํ„ฐ๋Ÿด์ด ๋จ

๐Ÿคฏ ๋ฆฌ์•กํŠธ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด(template literal)

  • ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋ฆฌํ„ฐ๋Ÿด์„ ํ…œํ”Œ๋ฆฟ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•
  • ์—ญ๋”ฐ์˜ดํ‘œ(` `)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ฐฑํ‹ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ž‘์„ฑํ•˜๊ณ  ๊ทธ ์•ˆ์— ๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ ์ต์Šคํ”„๋ ˆ์…˜์„ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•
  • ์ต์Šคํ”„๋ ˆ์…˜์„ ๋Œ€์ฒด๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„ Substitution๋ผ๊ณ  ๋ถ€๋ฆ„
// Untagged template literal
// ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด
`string text`

// ์—ฌ๋Ÿฌ ์ค„(Multi-line)์— ๊ฑธ์นœ ๋ฌธ์ž์—ด
`string text line 1
 string text line 2`
 
 // ๋Œ€์ฒด ๊ฐ€๋Šฅํ•œ expression์ด ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž์—ด
`string text ${expression} string text`

// Tagged template literal
// myFunction์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ expression์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๊ณผ expression์ด ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ„ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ๋จ
myFunction `string text ${expression} string text`;
  • UntaggedTemplateLiteral์€ ๋ณดํ†ต ๋ฌธ์ž์—ด์„ ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ์„œ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, ํฌ๋ฉ”ํŒ…์„ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด (TaggedTemplateLiteral)์€ ์•ž์— ๋‚˜์™€ ์žˆ๋Š” ํƒœ๊ทธ ํ‰์…˜์„ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ด
  • ํƒœ๊ทธ ํ‰์„ ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ต์Šคํ”„๋ ˆ์…˜์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๊ณผ ์ต์Šคํ”„๋ ˆ์…˜์ด ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ

  • myTagFunction์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํƒœ๊ทธ ํ‰์…˜์— ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ์ต์Šคํ”„๋ ˆ์…˜์ด ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ๋“ค์–ด๊ฐ€๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…
  • ํƒœ๊ทธ๋“œ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ž์—ด๊ณผ ์ต์Šคํ”„๋ ˆ์…˜์„ ํƒœ๊ทธ ํ‰์„ ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ์–ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ฒŒ ๋จ

 

๊ณต๋ถ€ํ•œ ์ž๋ฃŒ

https://www.inflearn.com/course/%EC%B2%98%EC%9D%8C-%EB%A7%8C%EB%82%9C-%EB%A6%AC%EC%95%A1%ED%8A% B8/dashboard

 

[์ง€๊ธˆ ๋ฌด๋ฃŒ] ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ(React) ๊ฐ•์˜ | Inje Lee (์†Œํ”Œ) - ์ธํ”„๋Ÿฐ

Inje Lee (์†Œํ”Œ) | ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ CSS ๊ธฐ์ดˆ ๋ฌธ๋ฒ•๊ณผ ํ•จ๊ป˜ ๋ฆฌ์•กํŠธ์˜ ๊ธฐ์ดˆ๋ฅผ ํƒ„ํƒ„ํ•˜๊ฒŒ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ๊น”๋”ํ•œ ๊ฐ•์˜์ž๋ฃŒ, ๊ผผ๊ผผํ•œ ์„ค๋ช…์œผ๋กœ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ๋ฆฌ์•กํŠธ ๊ฐ•์˜์ž…๋‹ˆ๋‹ค. ๐Ÿ‘จ‍๐Ÿซ ๋ฆฌ์•กํŠธ์˜ ์„ธ๊ณ„๋กœ

www.inflearn.com