๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ƒˆ์‹น

[์ƒˆ์‹น ํ”„๋ก ํŠธ์—”๋“œ] Styled-Components ๊ธฐ์ดˆ ๋ฐฐ์šฐ๊ธฐ

๐Ÿ’ป INTRO

์˜ค๋Š˜์€ React์— css๋ฅผ ์ ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ธ๋‹ค๋Š” Styled-Components์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค

 

Styled-Components๋Š” ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์˜ ํŠน์„ฑ์— ๊ฐ€์žฅ ์•Œ๋งž์€ css ์ž‘์„ฑ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ Sass๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋Š”๋ฐ ๊ธฐ์กด css์— ๋น„ํ•ด ๋งค์šฐ ํŽธ๋ฆฌํ–ˆ์ง€๋งŒ mixins ํŒŒ์ผ๋“ค์„ ์ œ์™ธํ•˜๊ณ ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์—„์ฒญ ๋งŽ์€ scss ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณธ ๊ฒŒ Styled-Components ์ธ๋ฐ์š”!! Styled-Components๋Š” CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— CSS๋ฅผ JS ํŒŒ์ผ์— ๋ฐ”๋กœ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๋‹ˆ ์Šคํƒ€์ผ์„ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋’ค์งˆ ํ•„์š”๊ฐ€ ์—†์–ด์ ธ์„œ ์œ ์ง€๋ณด์ˆ˜์— ์ •๋ง ํŽธํ•  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ๊ธฐ๋ณธ์ ์ธ Styled-Components ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ์š”?

 


๐Ÿ’ป ์‹ค์Šต

์„ค์น˜ ๋ฐฉ๋ฒ•

$ npm i styled-components

 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•
-๋จผ์ €  import styled from 'styled-components' ๋ฅผ ๋งจ ์œ„์— ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”
- ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ณ 
- styled ๋’ค์—๋Š” ์‚ฌ์šฉํ•  HTML ํƒœ๊ทธ๋ช…์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”
- ๊ทธ ํ›„ ์Šคํƒ€์ผ ์‹œํŠธ๋Š” ๋ฐฑํ‹ฑ(``)์œผ๋กœ ๊ฐ์‹ธ์„œ ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!!!!

 

 

 

๐Ÿ“• ์•„๋ž˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋ฉฐ Styled-Components๋ฅผ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

import styled from 'styled-components';

const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;

const Wrapper = styled.section`
  padding: 4em;
  background: papayawhip;
`;

return(
  <Wrapper> 
    <Title> 
      Hello World!
    </Title> 
  </Wrapper> 
);

 

 

์ด๋ ‡๊ฒŒ styled ๋’ค์— ์›ํ•˜๋Š” ํƒœ๊ทธ ์ด๋ฆ„์„ ์ ์–ด์ฃผ๊ณ  ๋ฐฑํ‹ฑ ๊ธฐํ˜ธ ์•ˆ์€ ๊ธฐ์กด CSS๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„œ Wrappper ์ปดํฌ๋„ŒํŠธ ์ž๋ฆฌ์— section ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ  Title ์ปดํฌ๋„ŒํŠธ ์ž๋ฆฌ์— h1์ด ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด

์ดํ•ด๊ฐ€ ์‰ฌ์šฐ์‹ค ๊ฑฐ์—์š”. ์Šคํƒ€์ผ์„ ์ž…ํžŒ ํƒœ๊ทธ๋ฅผ ์ปดํฌ๋„ŒํŠธ ํ˜•์‹์œผ๋กœ ๋„ฃ์–ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!!

 


๐Ÿ“• Styled-Components์— props๋ฅผ ์ ์šฉํ•ด๋ณด๊ธฐ

 

์ด๋ฒˆ์—๋Š” props๋ฅผ ํ™œ์šฉํ•ด์„œ ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊นŒ์š”?

 

import styled from 'styled-components';

const Button = styled.button`
  background: ${props => props.primary ? "palevioletred" : "white"};
  color: ${props => props.primary ? "white" : "palevioletred"};
  font-size: 1em;
  margin: 1em;
  padding: 0.25em 1em;
  border: 2px solid palevioletred;
  border-radius: 3px;
`;

return(
  <div>
    <Button>Normal</Button>
    <Button primary>Primary</Button>
  </div>
);

 

primary๋ฅผ props๋กœ ๋„˜๊ฒจ์ฃผ๊ณ  ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์กฐ๊ฑด์— ๋งž๋Š” ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‹ˆ CSSํŒŒ์ผ์„ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค ์ฝ”๋“œ๊ฐ€ ๋งŽ์ด ์งง์•„์ง€๊ณ  ํ•œ ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค :)

 

์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ๊ฒƒ์€ Styled-Components์˜ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์•„๋ž˜ ํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐ€์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์˜ Styled-Components ํ™œ์šฉ๋ฒ•์„ ์ตํžˆ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!!!!!

https://styled-components.com/

 


์ฐธ๊ณ 

https://styled-components.com/

 

 

 

์ƒˆ์‹นDT ๊ธฐ์—…์—ฐ๊ณ„ํ˜• ํ”„๋ก ํŠธ์—”๋“œ ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ ๊ณผ์ • 6์ฃผ์ฐจ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ