IT/Typescript
Styled Components & TypeScript
라임웨일
2022. 5. 24. 09:22
반응형
React에서 스타일을 지정하는 방법에는 여러 방법이 있지만 가장 많이 사랑받는 방법 중 하나가 바로 styled-components입니다. 그런데 Styled Components 라이브러리를 TypeScript로 전환하면서 같이 사용하기 위해서는 약간의 방법이 추가로 필요합니다.
1. 유형 설치
Styled Components 라이브러리는 유형과 함께 제공되지 않습니다. 확실한 유형이 지정된 저장소에서 설치해야 합니다.
npm i --save-dev @types/styled-components
2. 스타일 작성하기
😊 단일 props 사용 시
CSS-in-JS 솔루션을 사용하는 주요 이점 중 하나는 사용자가 자신에게 필요한 값을 Props로 전달하고 그에 따라 CSS를 조정할 수 있다는 것입니다.
컴포넌트에 타입 지정할 때는 styled.div <인터페이스명>과 같이 사용합니다.
// styled-components에 1개 props 타입지정
// const Container = styled.div< {프롭스명 : 타입지정} >`
const Heading = styled.h1<{ active: boolean }>`
color: ${props => (props.active ? 'red' : 'blue')};
`;
Import한 컴포넌트에서도 JSX Elements에서와 마찬가지로 컴포넌트 뒤에 제네릭 유형을 전달할 수 있습니다.
import Title from './Title';
const Heading = styled(Title)<{ active: boolean }>`
color: ${props => (props.active ? 'red' : 'blue')};
`;
😊 복수 props 사용 시 : interface 작성
인터페이스로 분리하여 타입을 지정하며 사용법은 같습니다.
// Container styled-components에 적용할 interfacer를 작성
interface Container extends 상속타입 {
isActive: boolean;
age: number;
프롭스명: 타입지정;
}
// styled-components에 interface 타입 지정하기
const Container = styled.div<Container>`
color: ${(props) => (props.age > 20 ? 'red' : 'gray')};
background-color: ${(props) => (props.isActive ? 'red' : 'gray')};
`;
interface 상속받기
// 상속컴포넌트의 타입 상속받기
interface Container {
isActive: boolean;
age: number;
프롭스명: 타입지정;
}
// 상속받은 컴포넌트에 타입 추가하기
const Container = styled(상속받을 컴포넌트명)<Container>`
color: ${(props) => (props.age > 20 ? 'red' : 'gray')};
background-color: ${(props) => (props.isActive ? 'red' : 'gray')};
`;
단일 props 타입 지정하기
- 상속 컴포넌트명을 콜백 함수(callback function)으로 전달
- 매개변수는 신규 타입:age과, 부모의 타입:parentProps을 전개 연산자(... parentProps)로 지정
- 신규 타입은 제네릭으로 기존과 동일하게 전달
// 기존 방식과 동일하게 사용
const Container = styled(상속받을 컴포넌트명)< { age : number } >`
color: ${(props) => (props.age > 20 ? 'red' : 'gray')};
`;
// 위 방식에 문제가 있을경우 아래와 같이 사용.. 하나 복잡!
const Container = styled(({ age, ...parentProps }) => (
<상속받을컴포넌트명 {...parentProps} />
))<{
age: number;
}>`
color: ${(props) => (props.active ? 'red' : 'blue')};
`;
3.Media templates
const customMediaQuery = (maxWidth: number) =>
`@media (max-width: ${maxWidth}px)`;
const media = {
custom: customMediaQuery,
desktop: customMediaQuery(922),
tablet: customMediaQuery(768),
phone: customMediaQuery(576),
};
const Content = styled.div`
height: 3em;
width: 3em;
background: papayawhip;
/* Now we have our methods on media and can use them instead of raw queries */
${media.desktop} {
background: dodgerblue;
}
${media.tablet} {
background: mediumseagreen;
}
${media.phone} {
background: palevioletred;
}
`;
render(<Content />);
출처 :
반응형