Motivation - Styled Component
Styled Component(이하 SC)는 React 라이브러리임. CSS의 성능 향상을 위해 탄생함
이를 사용하면 기존 CSS 문법으로도 스타일 속성이 추가된 React 컴포넌트를 만들 수 있음
예를 들어 SC를 이용하면 애플리케이션 내에 다른 웹페이지로 이동하는 기능을 가진 Button 을 하나 만들때
아마도 아래 코드와 같을거임.
const Button = styled.a`
display: inline-block;
border-radius: 3px;
padding: 0.5rem 0;
margin: 0.5rem 1rem;
width: 11rem;
`;
이는 기존의 학습했던 것과 거의 같음.
- SC의 특징은 아래와 같음
- Automatic critical CSS Styled Component 는 화면에 어떤 컴포넌트가 렌더링 되었는지 추적해서 해당하는 컴포넌트에 대한 스타일을 자동으로 삽입합니다. 따라서 코드를 적절히 분배해 놓으면 사용자가 애플리케이션을 사용할 때 최소한의 코드만으로 화면이 띄워지도록 할 수 있음.
- No class name bugs Styled Component 는 스스로 유니크한 className 을 생성. 이는 className 의 중복이나 오타로 인한 버그를 줄여줌.
- Easier deletion of CSS 기존에는 더 이상 사용하지 않거나 삭제한 컴포넌트에 해당하는 스타일 속성을 제거하기 위해 CSS 파일 안의 className을 이리저리 찾아야 했지만 Styled Component 는 모든 스타일 속성이 특정 컴포넌트와 연결되어 있기 때문에 만약 컴포넌트를 더 이상 사용하지 않아 삭제할 경우 이에 대한 스타일 속성도 함께 삭제됨.
- Simple dynamic styling className을 일일이 수동으로 관리할 필요 없이 React 의 props 나 전역 속성을 기반으로 컴포넌트에 스타일 속성을 부여하기 때문에 간단하고 직관적.
- Painless maintenance 컴포넌트에 스타일을 상속하는 속성을 찾아 다른 CSS 파일들을 검색하지 않아도 되기 때문에 코드의 크기가 커지더라도 유지 보수가 어렵지 않음.
- Automatic vendor prefixing 개별 컴포넌트마다 기존의 CSS 를 이용하여 스타일 속성을 정의하면 될 뿐. 이외의 것들은 Styled Component 가 알아서 처리해 줌.
Installation
Styled Component 의 설치.
터미널에 아래의 명령어 한 줄을 입력해 Styled Component 라이브러리를 설치할 수 있습니다.
# with npm
$ npm install --save styled-components
# with yarn
$ yarn add styled-components
- Styled Component 에서는 package.json에 다음 코드를 추가하도록 권장하고 있음.
아래의 코드를 추가하면 여러 버전의 Styled Component가 설치되어 발생하는 문제를 줄여줌.
{
"resolutions": {
"styled-components": "^5"
}
}
Getting Started
Styled Component 는 tagged template literals 라는 ES6 문법을 이용함.(` ${name}... ` )
컴포넌트를 만들 때에 해당 문법을 사용해 컴포넌트의 스타일 속성을 정의하면
별도의 CSS 파일 없이도 스타일 속성을 지닌 컴포넌트를 만들 수 있음.
- 다음 예제가 있음.
<Title>과 <Wrapper>라는 컴포넌트에 스타일 속성을 정의한 후
React에서 컴포넌트를 사용하는 것과 동일하게 리턴문 안에서 해당 컴포넌트들을 사용하고 있음.
예제 코드 안의 주석을 주의 깊게 살펴보자.
<h1> tag의 스타일 속성은 styled.h1, <section> tag의 스타일 속성은 styled.section 을 사용하고 있음!
Adapting based on props & Extending Styles
Styled Component 는 스타일 속성을 지닌 컴포넌트를 정의할 때에 함수를 전달하고
그 함수 안에서 props 를 사용할 수도 있음.
<Button> 컴포넌트의 background 와 color 속성은 primary 라는 props 의 전달 여부에 따라 컬러값을 정의하고 있습니다.
// Button component
...
background: ${(props) => (props.primary ? "palevioletred" : "white")};
color: ${(props) => (props.primary ? "white" : "palevioletred")};
...
// App component
...
<Button>Normal</Button>
<Button primary>Primary</Button> // 여기서 전달!
...
- 같은 스타일 속성을 지닌 여러 개의 컴포넌트들 중 몇 개의 컴포넌트에는 약간의 변화를 주고 싶은 경우도 있을 것.
이때에는 상속받고자 하는 스타일 속성을 지닌 컴포넌트를 styled() 로 감싼 뒤, 변경하고 싶은 속성만 새로 정의해 주면 기존 속성을 확장하여 사용할 수 있음.
// 기존의 Button 컴포넌트에 Tomato 컴포넌트만을 위한 새로운 속성 추가
const Tomato = styled(Button)` // `는 리터럴 문법 시작
color: tomato;
border-color: tomato;
`;
Passed props
이번에는 아래 Input 컴포넌트의 color 속성을 주목해서 살펴보자.
import styled from "styled-components";
// Styled Component로 만들어진 Input 컴포넌트 입니다.
const Input = styled.input`
padding: 0.5em;
margin: 0.5em;
color: ${(props) => props.inputColor || "red"};
background: papayawhip;
border: none;
border-radius: 3px;
`;
export default function App() {
return (
<div>
{/* 아래 Input 컴포넌트는 styled component인 Input 컴포넌트에 지정된 inputColor(red)가 적용되었습니다. */}
<Input defaultValue="김코딩" type="text" />
{/* 아래 Input 컴포넌트는 props로 전달된 커스텀 inputColor(blue)가 적용되었습니다. */}
<Input defaultValue="박해커" type="text" inputColor="blue" />
</div>
);
}
props 로 color 속성이 전달된 Input 컴포넌트는 해당 color 속성이 글자색에 적용되고,
props 가 전달되지 않은 Input 컴포넌트는 기본 색상(여기서는 빨간색)이 적용된 것을 확인할 수 있음.
이처럼 컴포넌트에 props 로 스타일 속성이 전달된다면 해당 컴포넌트는 props 로 전달된 속성을 우선 적용하며,
전달되는 속성이 없다면 기본으로 설정된 속성을 적용합니다.
이는 Styled Component 가 개발자에 의해 설정된 속성과 기본 속성을 구분할 수 있기 때문임.
'코딩공부 > T.I.L' 카테고리의 다른 글
2022-02-17 [React] 상태 관리 성취목표 (0) | 2022.02.17 |
---|---|
2022-02-14 DOM reference를 잘 활용할 수 있는 useRef (0) | 2022.02.14 |
2022-02-14 구조적인 CSS 작성 방법의 발전 (0) | 2022.02.14 |
2022-02-14 Component Driven Development (0) | 2022.02.14 |
2022-02-14 컴포넌트 디자인 방법론 성취목표 (0) | 2022.02.14 |