ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. Styled-components - 컴포넌트 스타일링 | 벨로퍼트
    Front-end/React.js 2020. 7. 20. 10:06
    반응형

    이번에 배워볼 기술은 CSS in JS 라는 기술입니다. 이 문구가 뜻하는 그대로, 이 기술은 JS 안에 CSS 를 작성하는 것을 의미하는데요, 우리는 이번 튜토리얼에서 해당 기술을 사용하는 라이브러리인 styled-components 를 다뤄볼 것입니다.

     

    styled-components 는 현존하는 CSS in JS 관련 리액트 라이브러리 중에서 가장 인기 있는 라이브러리입니다. 이에 대한 대안으로는 emotion 와 styled-jsx가 있습니다.

     

     

    Tagged Template Literal

    styled-components 를 사용하기 전에, Tagged Template Literal 이라는 문법에 대하여 짚고 넘어가면, styled-components 가 내부적으로 어떻게 작동하는지 이해 할 수 있습니다. 참고로 이번에 다룰 내용은 조금 이해하기 어려울 수도 있는데요, 완벽히 이해하지 않아도 앞으로 styled-components 를 사용하는데 전혀 지장이 가지 않으니 가볍게 읽고 넘어가 주셔도 됩니다.

     

    아마, Template Literal 에 대해서는 익숙하실 것입니다. 문자열 조합을 더욱 쉽게 할 수 있게 해주는 ES6 문법이죠.

    const name = 'react';
    const message = `hello ${name}`;
    
    console.log(message);
    // "hello react"

    만약에, 우리가 Template Literal 을 사용 할 때 ${} 안에 일반 문자열 / 숫자가 아닌 객체를 넣는다면 어떻게 될까요?

    const object = { a: 1 };
    const text = `${object}`
    console.log(text); // "[object Object]"
    
    /* 만약에 함수를 넣는다면 어떻게 될까요? */
    const fn = () => true
    const msg = `${fn}`;
    console.log(msg); // "() => true"

    만약에, 우리가 Template Literal 을 사용하면서도, 그 내부에 넣은 자바스크립트 값을 조회하고 싶을 땐 Tagged Template Literal 문법을 사용 할 수 있습니다.

    const red = '빨간색';
    const blue = '파란색';
    function favoriteColors(texts, ...values) {
      console.log(texts);
      console.log(values);
    }
    
    favoriteColors`제가 좋아하는 색은 ${red}과 ${blue}입니다.`

    여기서 함수 파라미터쪽에서는 파라미터의 rest 문법이 사용되었습니다. 우리가 입력한 문자열이 모두 분해되어서, 우리가 넣어준 텍스트와 ${} 를 통해 넣어준 자바스크립트 값을 따로 따로 볼 수 있는데요 이 값들을 조합하여 우리는 이런 작업을 할 수 있습니다.

     

    const red = '빨간색';
    const blue = '파란색';
    function favoriteColors(texts, ...values) {
       return texts.reduce((result, text, i) => `${result}${text}${values[i] ? `<b>${values[i]}</b>` : ''}`, '');
    }
    favoriteColors`제가 좋아하는 색은 ${red}과 ${blue}입니다.`
    // 제가 좋아하는 색은 <b>빨간색</b>과 <b>파란색</b>입니다.

    코드가 좀 복잡하지요? 우리가 앞으로 개발하면서 favoriteColors 같은 함수를 작성할 일은 없으니 이해가기 어려워도 너무 걱정할 필요는 없습니다. 지금은 그냥 저런 문법이 있구나, 정도로 알아두기만헤도 충분합니다.

     

    styled-components 에서는 이런 문법을 사용해서 컴포넌트의 props 를 읽어오기도 하는데요, 지금은 맛보기로만 한번 확인해보세요.

    const StyledDiv = styled`
      background: ${props => props.color};
    `;

    Tagged Template Literal 을 사용하면 만약 ${} 을 통하여 함수를 넣어줬다면, 해당 함수를 사용해줄 수도 있답니다.

     

    예시 코드를 한번 확인해볼까요?

    function sample(texts, ...fns) {
      const mockProps = {
        title: '안녕하세요',
        body: '내용은 내용내용 입니다.'
      };
      return texts.reduce((result, text, i) => `${result}${text}${fns[i] ? fns[i](mockProps) : ''}`, '');
    }
    sample`
      제목: ${props => props.title}
      내용: ${props => props.body}
    `
    /*
    "
      제목: 안녕하세요
      내용: 내용은 내용내용 입니다.
    "
    */

     

     

    styled-components 사용하기

    이제 본격적으로 styled-components 를 본격적으로 사용해보겠습니다.

     

    새로운 프로젝트를 만들고, styled-components 를 설치해주세요.

    $ npx create-react-app styling-with-styled-components
    $ cd styling-with-styled-components
    $ yarn add styled-components

     

     

    그리고, 에디터로 해당 프로젝트를 열어주세요.

    그 다음에는 App 컴포넌트를 열어서 다음과 같이 styled-components 로 스타일링한 첫번째 컴포넌트를 만들어보세요.

    /src/App.js :

    import React from 'react';
    import styled from 'styled-components';
    
    const Circle = styled.div`
      width: 5rem;
      height: 5rem;
      background: black;
      border-radius: 50%;
    `;
    
    function App() {
      return <Circle />;
    }
    
    export default App;

    yarn start 명령어를 사용하여 개발 서버를 실행해보세요. 다음과 같은 결과가 나타났나요?

     

    styled-components 를 사용하면 이렇게 스타일을 입력함과 동시에 해당 스타일을 가진 컴포넌트를 만들 수 있습니다. 만약에 div 를 스타일링 하고 싶으면 styled.div, input 을 스타일링 하고 싶으면 styled.input 이런식으로 사용하면 되는거죠.

     

    이번에는, Circle 컴포넌트에 color 라는 props 를 넣어줘보겠습니다.

    /src/App.js :

    // ...
    const Circle = styled.div`
      width: 5rem;
      height: 5rem;
      background: ${props => props.color || 'black'};
      border-radius: 50%;
    `;
    
    function App() {
      return <Circle color="blue" />;
    }
    // ...

    파란색 원이 나타났나요?

    Circle 컴포넌트에서는 color props 값을 설정해줬으면 해당 값을 배경색으로 설정하고, 그렇지 않으면 검정색을 배경색으로 사용하도록 설정되었습니다.

     

    이번에는, huge 라는 props 를 설정됐을 때 크기를 더 키워서 보여주도록 작업을 해보겠습니다.

    /src/App.js :

    // ...
    import styled, { css } from 'styled-components';
    
    const Circle = styled.div`
      width: 5rem;
      height: 5rem;
      background: ${props => props.color || 'black'};
      border-radius: 50%;
      ${props =>
        props.huge &&
        css`
          width: 10rem;
          height: 10rem;
        `}
    `;
    
    function App() {
      return <Circle color="red" huge />;
    }
    // ...

    거대한 빨간색 원이 나타났나요?

     

    이런식으로 여러 줄의 CSS 코드를 조건부로 보여주고 싶다면 css 를 사용해야합니다., css 를 불러와서 사용을 해야 그 스타일 내부에서도 다른 props 를 조회 할 수 있습니다.

    반응형

    댓글

Luster Sun