[S3-Unit03] React - styled-components
포스트
취소

[S3-Unit03] React - styled-components

styled-components를 공부하기 전에, CDD의 개념을 알고 넘어가는 것이 좋다.

CDD (Component Driven Development)
CDD 는 부품 단위로 UI 컴포넌트를 만들어 나가는 개발을 진행하는 것을 말한다.

즉, CDD는 재사용 할 수 있는 UI 컴포넌트를 미리 디자인하고 개발하는 것을 의미한다. 이 CDD를 할 수 있는 방법 중 대표적인 React 라이브러리 styled-components가 있다.


styled-components란?

styled-components 는 CSS in JS 라는 개념이 대두되면서 나온 라이브러리다.

기본적으로 CSS를 코드를 다룰 때, class 이름을 고민하거나 CSS 파일에서 내가 원하는 부분을 찾는 경우가 힘든 경우가 한 번쯤 있었을 것이다.

이러한 문제점인 CSS를 컴포넌트화 시킴으로써 해결해주고, 현재 CSS in JS 라이브러리 중에서 가장 인기 있는 라이브러리다.

styled-components 설치하기

1. library install

설치하는 방법은 간단하다. 내가 이 라이브러리를 사용할 곳에서 다음과 같은 명령어를 입력하기만 하면 된다.

1
2
3
4
5
# npm install
npm install styled-components

# yarn install
yarn add styled-components

2. package setting

공식 홈페이지에서는 package.json에 다음 코드를 추가하도록 권장하고 있다. 이렇게 설정할 경우, 여러 버전의 스타일 구성 요소가 설치되어 여러 버전이 설치되어 발생하는 문제점을 줄여준다.

1
2
3
4
5
{
  "resolutions": {
    "styled-components": "^5"
  }
}

3. library import

마지막으로는 styled-components를 사용할 파일에 불러오기만 하면 된다.

1
import styled from "styled-components"

vscode에서 다음과 같은 vscode-styled-components 플러그인을 제공한다. 가독성과.. 수많은 이유로 현재까지도 유용하게 잘 사용하고 있다.


styled-components 문법

1. 컴포넌트 생성하기

ES6의 Templete Literals 문법을 사용하므로 백틱(`)을 꼭 붙여야한다.

1
2
3
4
5
6
7
8
9
10
const 컴포넌트이름 = styled.태그종류`
	css속성 1: 속성값;
	css속성 2: 속성값;
`;

// 예시
const InputButton = styled.div`
	background-color: gray;
	display: flex;
`;

2. 컴포넌트 재활용해서 새로운 컴포넌트 생성하기

이미 만들어진 컴포넌트를 재활용해서 다음과 같이 컴포넌트를 생성할 수 있다. 컴포넌트를 선언하고 styled() 에 재활용할 컴포넌트를 전달해준 다음, 추가하고 싶은 스타일 속성을 작성하면 된다.

1
2
3
4
5
6
7
8
9
const 컴포넌트이름 = styled.(재활용할 컴포넌트)`
	추가할 css속성 1: 속성값;
	추가할 css속성 2: 속성값;
`;

// 예시
const InputColorButton = styled.(InputButton)`
	color: #fff;
`;

3. props 활용하기

styled-component로 만든 컴포넌트도 React 컴포넌트처럼 props를 내려줄 수 있다. 내려준 props 값에 따라서 컴포넌트를 렌더링하는 것도 가능하다.

1
2
3
const 컴포넌트이름 = styled.태그종류`
	css속성: ${(props) => 함수 코드}
`;

[예제 1]

다음은 삼항연산자를 활용하여 <Button1> 컴포넌트에 skyblue 라는 props가 있는지 확인하고, 있으면 배경색으로 skyblue 를, 없을 경우 white 를 지정해주는 코드다.

1
2
3
4
5
6
7
8
9
10
11
12
13
const Button1 = styled.button`
	background: ${(props) => (props.skyblue ? "skyblue" : "white")};
`;

export default function App () {
  return (
    <>
      <GlobalStyle />
      <Button1>Button1</Button1>
      <Button1 skyblue>Button1</Button1>
    </>
  );
}

[예제 2]

다음 예제도 삼항연산자를 사용하고 있지만 <Button1><Button2> 컴포넌트에 props.color 가 없다면 whiteprops.color 가 있다면 그대로 값을 가져와서 스타일 속성 값으로 리턴해주는 코드다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const Button1 = styled.button`
  background: ${(props) => (props.color ? props.color : "white")};
`;
// 위와 같은 방식.
const Button2 = styled.button`
  background: ${(props) => props.color || "white"};
`;

export default function App() {
  return (
    <>
      <GlobalStyle />
      <Button1>Button1</Button1>
      <Button1 color="orange">Button1</Button1>
      <Button1 color="tomato">Button1</Button1>
      <br />
      <Button2>Button2</Button2>
      <Button2 color="pink">Button2</Button2>
      <Button2 color="turquoise">Button2</Button2>
    </>
  );
}

4. 전역 스타일 설정하기

스타일을 컴포넌트로 생성할 수 있지만, 전역에 스타일을 저장하여 사용할 수도 있다.

전역 스타일을 설정하기 위해선 createGlobalStyle 함수를 불러와야 한다.

1
import { createGlobalStyle } from "styled-components";

그 다음 이 함수를 사용하여 CSS 파일에서 작성하듯 설정해주고 싶은 스타일을 작성한다.

1
2
3
4
5
6
7
const GlobalStyle = createGlobalStyle`
	button {
		padding : 5px;
    margin : 2px;
    border-radius : 5px;
	}
`;

이렇게 만들어진 <GlobalStyle> 컴포넌트를 최상위 컴포넌트에서 사용해주면 전역에 <GlobalStyle> 컴포넌트의 스타일이 적용된다.

1
2
3
4
5
6
7
8
function App() {
	return (
		<>
			<GlobalStyle />
			<Button>전역 스타일 적용하기</Button>
		</>
	);
}


Reference

CODESTATES (SEB_FE_43)

styled-components 공식 홈페이지

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.