리액트에서는 CSS를 어떻게 사용해야 할까?
리액트에서 컴포넌트를 스타일링하는 방식은 크게 4가지가 있다.
1. 일반CSS : CSS파일을 import하여 사용
2. SaSS : CSS 전처리기를 이용
3. CSS Module : 클래스 이름을 고유한 값으로 만들어서 컴포넌트 스타일 클래스 이름이 중첩되는 현상을 방지
4. styled-components : 자바스크립트 파일안에 스타일을 선언
이중에서 우리는 styled-components에 대해 알아보자!
styled-components
- 자바스크립트 파일안에 스타일을 선언하는 방식이다.
- CSS-in-JS 라이브러리중 개발자들이 가장 선호한다.
- Tagged 템플릿 리터럴 문법을 사용한다.
- props 값으로 전달해주는 값을 쉽게 스타일에 적용 할 수 있는 것이 큰 장점이다.
- 라이브러리 설치 명령어
npm install --save styled-components
yarn add styled-components
이 라이브러리를 사용하면 자바스크립트 파일 하나에 스타일까지 작성 할 수 있어 따로 스타일 파일을 만들지 않아도 된다는 장점이 있다.
Tagged 템플릿 리터럴 문법
- 스타일을 작성 할 때 `(백틱) 사용하여 만든 문자열에 스타일 정보를 넣어주는 방법이다.
- 일반 템플릿은 객체나 함수를 넣으면 형태를 잃어버리게 된다.
( 객체는 [object object]로 변환되고, 함수는 함수 내용이 그대로 문자열화 되어 나온다. )
- Tagged 템플릿 리터럴을 사용하면 템플릿 사이사이세 들어가는 JS객체나 함수 원본값을 그대로 추출하는 속성을 이용해 props를 스타일쪽에서 쉽게 조회할 수 있도록 해준다.
[예제1] - 글로벌 스타일 적용
- 글로벌 스타일은 styled-components가 제공하는 createGlobalStyle() 함수를 사용
- 현재 최상위 컴포넌트 상단에 추가해주면 된다.
App.js
import React from "react";
import ReactDOM from 'react-dom';
import { createGlobalStyle } from "styled-components";
import Example from "./Components/Example";
const GlobalStyle = createGlobalStyle`
span {
color : red;
}
`;
const App = () => (
<React.Fragment>
<GlobalStyle />
<h1>Hi, I'm an app!</h1>
<h2>Hi, I'm an app!</h2>
<span>여러분</span>
<Example />
</React.Fragment>
);
export default App;
- createGlobalStyle함수를 사용하여 글로벌 style을 만들었다. ( span태그에 color:red)
- 현재 span태그는 총 3개이다. (App.js1개 , Example.jsx 2개 )
- 전역 스타일에 의해 3개의 span태그의 color가 red로 바뀌는것을 알 수 있다.
Example.jsx
const Example = () => {
return (
<>
<span>안녕하세요.</span>
<span>저는 델리나입니다. </span>
</>
);
};
export default Example;
[결과]
[예제2] - Reset css적용
- styeld-reset이라는 패키지를 다운받고 , 제공하는 reset을 적용한다.
- styled-reset 설치하기
npm i styled-reset
위에서 사용했던 예제에 추가를 해보았다.
App.js
import React from "react";
import ReactDOM from "react-dom";
import { createGlobalStyle } from "styled-components";
import Example from "./Components/Example";
import reset from "styled-reset"; //reset import하기 추가
const GlobalStyle = createGlobalStyle`
${reset}
span {
color : red;
}
`;
const App = () => (
<React.Fragment>
<GlobalStyle />
<h1>Hi, I'm an app!</h1>
<h2>Hi, I'm an app!</h2>
<span>여러분 </span>
<Example />
</React.Fragment>
);
export default App;
- GlobalStyle 아래 {reset} 를 추가 해주었다.
- reset css를 적용하기 전 h1,h2 태그와 적용후 태그의 크기가 달라진것을 볼 수 있다.
[결과]
[예제3] styled와 props에 따른 조건부 스타일 적용
- styled-components에서 제공하는 styled를 사용한다.
App.js
import React from "react";
import ReactDOM from "react-dom";
import { createGlobalStyle } from "styled-components";
import Example from "./Components/Example";
import reset from "styled-reset";
import styled from "styled-components"; //styled import
const GlobalStyle = createGlobalStyle`
${reset}
span {
color : red;
}
`;
const SetColor = styled.h1`
color: ${(props) => props.color};
`;
const App = () => (
<React.Fragment>
<GlobalStyle />
<SetColor color="blue">
<h1>Hi, I'm an app!</h1>
<h2>Hi, I'm an app!</h2>
</SetColor>
<span>여러분 </span>
<Example />
</React.Fragment>
);
export default App;
- styled를 import한다.
- SetColor를 선언한다. 이때 tagged 템플릿 리터럴문법을 사용하고, color를 props값에 따라 스타일링된다.
- 이 코드에서는 color를 blue로 주었다.
[결과]
마치며
이 글에서는 styled-components를 이용해 컴포넌트 스타일링을 해보았다.
하지만 다른 방법도 모두 사용하는 기술이며 , 어떤 방식을 사용하는지는 회사컨벤션에 따라 다름을 유의하자!
'FE > REACT' 카테고리의 다른 글
[React - Hook] useRef가 뭘까 ? 어떻게 사용하지 ? (예제) (0) | 2022.06.14 |
---|---|
[React] SPA(Single Page Application)를 Q&A방식으로 알아보자! (0) | 2022.06.11 |
[React - Hook] useEffect을 사용해 시계만들기 (0) | 2022.06.09 |
[React] useState에서 사용하는 State는 정확히 무엇을 말하는걸까? (2) | 2022.06.09 |
[React - Hook] React에서 변하는 데이터 처리하는방법 ( Hook이 뭐고 useState는 뭐야? ) (0) | 2022.06.09 |