티스토리 뷰

반응형

Styled-Components With TS(theme, globalStyle)


TypeScript

TS에 Styled-Components를 적용해보자

설치

npm install @types/styled-components


1. 테마

공통적으로 사용되는 스타일을 테마로 묶어서 코드일관성을 지킬 수 있도록 한다.

이를 위해 먼저 타입선언과 테마를 작성해야한다.

1.1 styled.d.ts: 타입선언파일, 테마작성하기

.d.ts를 타입선언파일이라고 한다. TS코드의 타입 추론을 돕는 파일이다.

첫번째 단계는 styled.d.ts 라는 테마에 사용될 변수들의 타입들을 선언하는 파일을 만드는 것이다.

styled.d.ts 만들기
import 'styled-components';

// and extend them!
declare module 'styled-components' {
  export interface DefaultTheme {
    borderRadius: string;

    colors: {
      main: string;
      secondary: string;
    };
  }
}

위에서 만든 선언파일로 styled-components 모듈에 DefaultTheme 라는 이름의 인터페이스를 생성해 타입을 명시해놓는다.

테마를 작성할 때 import하여 테마안에 선언된 타입에 맞게 스타일을 작성해주면 된다.

테마 작성하기
import { DefaultTheme } from 'styled-components';

const myTheme: DefaultTheme = {
  borderRadius: '5px',

  colors: {
    main: 'cyan',
    secondary: 'magenta',
  },
};

export { myTheme };

직접 만들어본 예제

Styles/styled.d.ts 파일 작성

import "styled-components";

declare module 'styled-components' {
  export interface DefaultTheme {
    bgColors: {
      primary: string;
    }
  }
}

Styles/theme/DefaultTheme.ts 파일 작성

import { DefaultTheme } from 'styled-components';

const myTheme: DefaultTheme = {
  bgColors: {
    primary: 'blue',
  }
};

export { myTheme };

App.tsx

import styled, { ThemeProvider } from 'styled-components';
import { myTheme } from './styles/theme/DefaultTheme';

function App() {
  return (
    <div className='App'>
      <ThemeProvider theme={myTheme}>
        <Button>HELLO</Button>
      </ThemeProvider>
    </div>
  );
}

export default App;

const Button = styled.button`
  background-color: ${(props) => props.theme.bgColors.primary};
`;

주로 테마를 어떻게 구분해서 사용하지? 하나로써 사용하나?

2. Global Style

전역적으로 사용하는 스타일을 관리한다.

컴포넌트 형식으로 사용할 수 있다.

box-sizing 과 같은 baseCSS 규칙을 지정할 때 사용한다.

import {createGlobalStyle} from 'styled-components'

const GlobalStyle = createGlobalStyle`
    body {
        font-family : ...,
}
`
const App = () => {
  return (
      <div>
      <GlobalStyle/>
        <Button>1</Button>
        <Button>2</Button>
    </div>
  )
}

적용

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { ThemeProvider } from 'styled-components';
import { myTheme } from './styles/theme/DefaultTheme';
import { GlobalStyle } from './styles/GlobalStyle';

ReactDOM.render(
  <React.StrictMode>
    <>
      <GlobalStyle />
      <ThemeProvider theme={myTheme}>
        <App />
      </ThemeProvider>
    </>
  </React.StrictMode>,
  document.getElementById('root'),
);

참고
반응형

'프로그래밍 > React' 카테고리의 다른 글

Infinite Scroll 구현 (feat. pair Programming)  (2) 2021.07.27
React에서 Infinite scroll 구현하기 (IntersectionObserver)  (0) 2021.06.19
recoil 정리  (0) 2021.05.25
Scroll Restoration  (0) 2021.04.30
React에서의 Key의 역할  (0) 2021.04.20
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
농담곰의 고군분투 개발기