반응형
TL:DR; className을 사용한다
공식 예제에 가보면 이런 예시가 있다.
// This could be react-router-dom's Link for example
const Link = ({ className, children }) => (
<a className={className}>
{children}
</a>
);
const StyledLink = styled(Link)`
color: palevioletred;
font-weight: bold;
`;
render(
<div>
<Link>Unstyled, boring Link</Link>
<br />
<StyledLink>Styled, exciting Link</StyledLink>
</div>
);
리액트 라우터 돔의 Link처럼 생각할 수 있다고 한다.
실제로 아래와 같이 동작한다.
위의 코드를 codeSandbox에 붙여넣고 className만 삭제하면 동작하지 않는다.
즉, styled-components는
- 클래스명을 해시로 만들고,
- 해당 클래스를 포함한 스타일 시트를 돔에 삽입하고
- 해당 클래스명으로 스타일을 적용한다.
그러면 기존에 있는 css 클래스명은 어떻게 사용할까?
아래와 같이 사용한다.
주의 ! : 아래와 같이 클래스명을 지정해 버리면, 다른 스타일 속성들은 하나도 안먹는다!
const Wrapper = styled.div.attrs({
className: 'className'
})``;
위의 클래스명 스타일을 포함한 다른 스타일을 적용(확장)하고 싶으면 어떻게 할까?
컴포지션 API를 활용한다.
const ExtendedWrapper = styled(Wrapper)`color:red`
이 경우 두 개의 클래스명을 적용한다.
반응형
'FrontEnd' 카테고리의 다른 글
새로운 리액트 공식문서로 배우는 Reducer (0) | 2022.07.05 |
---|---|
몽고db 문법으로 불변성을 관리하는 immutability-helper (0) | 2022.07.05 |
디자인 시스템 컴포넌트를 만들 때 고려할 사항들 (0) | 2022.07.02 |
CSS Variables를 이용하여 컬러 팔레트 구성하기 (0) | 2022.07.02 |
[Next.js 튜토리얼] JS에서 리액트로 (0) | 2022.07.01 |