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 />);

 

출처 :

반응형

'IT > Typescript' 카테고리의 다른 글

타입스크립트 정리  (1) 2022.09.08
Typescript에서 React location의 state값 선언  (0) 2022.05.19
Object is possibly 'null' 오류 해결  (0) 2022.05.19
광고차단(애드블록)프로그램이나 브라우저를 사용중이시면 프로그램을 비활성화이나 블로그 주소를 예외 처리 해주시면 광고가 노출됩니다. 귀찮고 번거롭겠지만 광고 클릭은 저에게는 큰 힘이 됩니다. 🙇🏻‍♂️🙇🏻‍♀️
제 블로그의 모든 글은 제가 직접 작성 하고 다른 글을 참고할 때는 이전 글보다 읽기 편하게 수정해서 작성하고 있습니다. 커피 한잔 사먹고 더 열심히 좋은글로 보답하겠습니다.
오늘도 제 블로그에 와 주셔서 감사합니다. :)
//