Front-end/React
[React] 스타일드 컴포넌트(styled-compnents)
늘이
2023. 5. 15. 00:51
styled-compnents
- CSS문법을 그대로 사용하면서 결과물을 스타일링 된 컴포넌트 형태로 만들어주는 오픈소스 라이브러리
- 컴포넌트 개념을 사용하기 때문에 리액트와 궁합이 잘 맞음
- 태그드 템플릿 리터럴을 사용하여 구성 요소의 스타일을 지정
- <style></style>로 넣어주기 때문에 페이지 로딩 시간 단축
1) styled-compnents설치
# npm을 사용하는 경우
npm install --save styled-components
# yarn을 사용하는 경우
yarn add styled-components
2) styled-components 기본 사용법
- 태그드 템플릿 리터럴(tagged template literal)을 사용하여 구성 요소의 스타일 지정
템플릿 리터럴 - 리터럴을 템플릿 형태로 사용하는 자바 스크립트에서 제공하는 문법 - backticks(`)를 사용하여 문자열을 작성하고 그 안에 대체 가능한 expression을 넣는 방법 - 크게 언태그드 템플릿 리터럴(Untagged template literal)과 태그드 템플릿 리터럴로 나뉨 |
- backticks(`)으로 둘러싸인 문자열 부분에 CSS 속성을 넣고 태그 함수 위치에는 styled.<HTML 태그> 형태로 사용
const Block = styled.div`
padding: ${(props) => props.padding};
border: 1px solid black;
border-radius: 1rem;
background-color: ${(props) => props.backgroundColor};
color: white;
font-size: 2rem;
font-weight: bold;
text-align: center;
`;
3) styled-components의 props 사용하기
- 조건이나 동적으로 변하는 값을 사용해서 스타일링 할 때 props사용
import { useParams } from "react-router-dom";
import styled from 'styled-components';
let SkyBtn = styled.button`
background : ${ props => props.bg };
color : black;
padding : 10px;
`
function Detail(props) {
let {id} = useParams();
return (
<div className="container">
{/* props.bg로 컴포넌트 재활용 가능 */}
<SkyBtn bg="skyblue">버튼</SkyBtn>
<div className="row">
<div className="col-md-6">
<img src={"https://codingapple1.github.io/shop/shoes" + (props.shoes[id].id + 1) +".jpg"} width="100%" />
</div>
<div className="col-md-6">
<h4 className="pt-5">{props.shoes[id].title}</h4>
<p>{props.shoes[id].content}</p>
<p>{props.shoes[id].price}</p>
<button className="btn btn-danger">주문하기</button>
</div>
</div>
</div>
)
}
export default Detail;
4) styled-components의 스타일 확장하기 (기존 스타일 복사)
- 생성된 컴포넌트를 기반으로 추가적인 스타일을 적용하기위해 styled-components에서는 스타일 확장 기능 제공
5) 단점
- JS파일이 복잡해짐(컴포넌트가 styled컴포넌트인지 일반 컴포넌트인지 구분하기 어려움)
- JS파일간 중복 디자인이 필요한 경우 import 해서 사용하면 되는데, 이렇게 사용하면 css파일 쓸 때랑 별 차이가 없음
- css 담당 디자이너가 있다면 협업 시 불편함(디자이너가 styled-components 문법을 모르는 경우 css를 받아 문법을 수정해야 하기 때문)