React

[React] styled-components 설치 및 사용, 스타일 확장

윤갬 2023. 1. 12. 22:35

styled-components


styled-components는,

css 문법을 그대로 사용하면서 결과물을 스타일링된 컴포넌트 형태로 나타내주는 오픈소스이다.

컴포넌트를 사용하기 때문에 리액트와 궁합이 잘 맞아, 리액트 개발에 많이 사용하고 있다.

 

styled-components 설치하기

# npm을 사용하는 경우
npm install --save styled-components

# yarn을 사용하는 경우
yarn add styled-components

아래 코드를 작성하여 styled-component가 잘 적용됐는지 확인할 수 있다. 

import React from "react";
import styled from "styled-components";

const Wrapper = styled.div`
  padding: 1em;
  background: grey
`
const Title = styled.h1`
  font-size: 1.5em;
  color: white;
  text-align: center;
`

function MainPage(props) {
  return (
    <Wrapper>
      <Title>
          안녕, 리액트!
      </Title>
    </Wrapper>
  ) 
}

export default MainPage;

styled-components 기본 사용법

tagged template literal(``)을 사용하여 css가 적용된 리액트 컴포넌트를 만들어준다.

  • ``로 둘러싸인 문자열 부분에 css를넣고
  • 태그 함수 위치에는 styled.(HTML Tag)을 넣는다.

📌 styled-components 사용 예시

import React from "react";
import styled from "styled-components";

const Wrapper = styled.div`
  padding: 1em;
  background: grey

styled-components props 사용하기

import React from "react";
import styled from "styled-components";

const Button = styled.button`
  color: ${props => props.dark ? "white" : "dark"};
  background: ${props => props.dark? "black" : "white"};
  border: 1px solid black;
`

function Sample(props) {
  return(
    <div>
      <Button>Normal</Button>
      <Button dark>Dark</Button>
    </div>
  )
}

export default Sample;

styled-components의 스타일 확장하기

import React from "react";
import styled from 'styled-components';

// Button 컴포넌트
const Button = styled.button`
  color: grey;
  border: 2px solid palevioletred;
`;

// Button에 style이 추가된 RoundedButton 컴포넌트
// -> 다른 컴포넌트의 style을 확장해서 사용
const RoundedButton = styled(Button)`
  border-radius:16px;
`;

function Sample(props) {
  return (
    <div>
      <Button>Normal</Button>
      <RoundedButton>Rounded</RoundedButton>
    </div>
  )
}

https://styled-components.com/docs



🚀 참고

 

 더 공부할 것

  • Tagged template literal, ↔ Untagged template literal