[React] styled-components

๊ฒจ๋ ˆยท2024๋…„ 11์›” 20์ผ

[React] ๋ฆฌ์•กํŠธ ์Šคํ„ฐ๋””

๋ชฉ๋ก ๋ณด๊ธฐ
55/95

๐Ÿ“ styled-components
์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง์˜ ๋˜ ๋‹ค๋ฅธ ํŒจ๋Ÿฌ๋‹ค์ž„์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์•ˆ์— ์Šคํƒ€์ผ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹(CSS-in-JS)์ด๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…๋ฅ˜๋Š” ์ •๋ง ๋งŽ๋‹ค.


CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ์„ ํ˜ธํ•˜๋Š” styled-components์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

๋จผ์ € ์„ค์น˜๋ถ€ํ„ฐ ํ•ด ์ค€๋‹ค.

$ yarn add styled-components

โ“๐Ÿค” styled-components ์‚ฌ์šฉ ์‹œ ์žฅ์ ์€?
๐Ÿ‘‰ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ํ•˜๋‚˜์— ์Šคํƒ€์ผ๊นŒ์ง€ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด .css ๋˜๋Š” .scss ํ™•์žฅ์ž๋ฅผ ๊ฐ€์ง„ ์Šคํƒ€์ผ ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋œ๋‹ค!


  • src ๋””๋ ‰ํ„ฐ๋ฆฌ์— StyledComponent.jsx ํŒŒ์ผ ์ƒ์„ฑ ํ›„, ๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ ์ž‘์„ฑ
    • StyledComponent.jsx
      import styled, { css } from 'styled-components';
      
      const Box = styled.div`
      /* props๋กœ ๋„ฃ์–ด ์ค€ ๊ฐ’์„ ์ง์ ‘ ์ „๋‹ฌํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. */
      background: ${props => props.color || 'blue'};
      padding: 1rem;
      display: flex;
      `;
      
      const Button = styled.button`
      background: white;
      color: black;
      border-radius: 4px;
      padding: 0.5rem;
      display: flex;
      align-items: center;
      justify-content: center;
      box-sizing: border-box;
      font-size: 1rem;
      font-weight: 600;
      
      /* & ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Sass์ฒ˜๋Ÿผ ์ž๊ธฐ ์ž์‹  ์„ ํƒ ๊ฐ€๋Šฅ */
      &:hover {
        background: rgba(255, 255, 255, 0.9);
      }
      
       /* ๋‹ค์Œ ์ฝ”๋“œ๋Š” inverted ๊ฐ’์ด true์ผ ๋•Œ ํŠน์ • ์Šคํƒ€์ผ์„ ๋ถ€์—ฌํ•ด ์ค๋‹ˆ๋‹ค. */
      ${props =>
        props.inverted &&
        css`
          background: none;
          border: 2px solid white;
          color: white;
          &:hover {
            background: white;
            color: black;
          }
        `};
      & + button {
        margin-left: 1rem;
      }
      `;
      
      const StyledComponent = () => (
      <Box color="black">
        <Button>์•ˆ๋…•ํ•˜์„ธ์š”</Button>
        <Button inverted={true}>ํ…Œ๋‘๋ฆฌ๋งŒ</Button>
      </Box>
      );
      
      export default StyledComponent;
    • App.jsx
      import React, { Component } from 'react';
      import StyledComponent from './StyledComponent';
      
      class App extends Component {
      render() {
        return (
          <div>
            <StyledComponent />
          </div>
        );
      }
      } 
      export default App;

โ“๐Ÿค” styled-components์™€ ์ผ๋ฐ˜ classNames๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CSS/Sass์™€ ๋น„๊ต ์‹œ ์žฅ์ ์€?
๐Ÿ‘‰ props ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•ด ์ฃผ๋Š” ๊ฐ’์„ ์‰ฝ๊ฒŒ ์Šคํƒ€์ผ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ!

profile
ํ˜ธ๋–ก ์‹ ๋ฌธ์ง€์—์„œ ๊ฐœ๋ฐœ์ž๋กœ ํ™˜์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€