React

[ReactJS] Style Components

cob 2022. 8. 18. 16:12
 css 파일을 밖에 두고, 태그나 id, class이름으로 가져와 쓰지 않고, 동일한 컴포넌트에서 컴포넌트 이름을 쓰듯 스타일을 지정하는 것을 styled-components라고 한다.
css 파일을 밖에 두지 않고, 컴포넌트 내부에 넣기 때문에, css가 전역으로 중첩되지 않도록 만들어주는 장점이 있다.

 

css를 적용하기 위한 3가지 방법
- 태그에 직접 속성 style={}
- 적용 속성 모듈화 파일 생성 (Button.module.css)
- Style Component

 

 


1. 라이브러리 설치

npm i styled-components

/* TypeScript의 경우 추가 */
npm i @types/styled-components

 

 

 


2. 사용방법

import styled from "styled-components";


const Box = styled.div`
  background-color: tomato;
  width: 100px;
  height: 100px;
`;


function App() {
  return (
      <Box />
  );
}

export default App;
  • back tick(``) 문자 안에 css 적용
  • 스타일링 된 컴포넌트 사용 가능
  • 알아보기 쉬운 이름으로 변경 가능 ex) Box, Title
  • css를 반복할 필요가 없이 재사용 가능

 

 


3.  Style 컴포넌트에 props 전달 

import styled from "styled-components";

const Box = styled.div`
  background-color: ${(props) => props.bgColor};
  width: 100px;
  height: 100px;
`;

function App() {
  return (
    <Father>
      <Box bgColor="teal" />
      <Box bgColor="tomato" />
    </Father>
  );
}

export default App;
  • props 전달 방법을 그대로 사용 가능하다.

 

2-1) React TypeScript Prop

const Tab = styled.span<{ isActive: boolean }>`
  color: ${(props) =>
    props.isActive ? 'red' : 'gray'};

`;


<Tab isActive={true}>
  • TypeScript는 타입을 정의해 줘야 한다.

 

 

 


4. 컴포넌트 확장(extend)

컴포넌트의 모든 요소를 유지하면서 새로운 코드를 추가
import styled from "styled-components";

const Box = styled.div`
  background-color: ${(props) => props.bgColor};
  width: 100px;
  height: 100px;
`;

/* Box style를 그대로 가져와 추가 */
const Circle = styled(Box)`
  border-radius:50px;
`;

function App() {
  return (
    <Father>
      <Box bgColor="teal" />
      <Box bgColor="tomato" />
    </Father>
  );
}

export default App;
  • 기존 컴포넌트의 모든 속성을 들고 와 새로운 속성까지 추가한다. props도 가져옴

 

 

 

 


5. element(태그) 변경

컴포넌트이 모든 요소를 같게 하고 싶지만, 태그만 변경하고 싶을 때
import styled from "styled-components";

const Box = styled.div`
  background-color: ${(props) => props.bgColor};
  width: 100px;
  height: 100px;
`;

function App() {
  return (
      <Box as="a" href="/" />
  );
}

export default App;
  • as=”a” : as라는 props로 a태그를 보내게 되면 Box는 a태그로 변경된다.

 

 

 


6. HTML attribute(속성) 설정.

태그의 속성이 반복되는 컴포넌트를 만들 수 있다 이럴경우 .attrs() 사용해 미리 적용할 수 있다.
import styled from "styled-components";

const Input = styled.input.attrs({ required: true, minLength:10 })`
	background-color: tomato;
`;
function App() {
  return (
      <Input /> 
			<Input />
  );
}

export default App;
  • attrs({}) : 모든 속성을 가진 오브젝트를 담을 수 있다.

 

 

 


7. 애니메이션 효과 적용

import styled, { keyframes } from "styled-components";


const Wrapper = styled.div`
  display: flex;
`;

/* 애니메이션 */
const rotatioAnimation = keyframes`
  0% {
    transform:rotate(0deg);
    border-radius:0px;
  }
  50% {
    transform:rotate(360deg);
    border-radius:50px;
  }
  100% {
    transform:rotate(0deg);
    border-radius:0px;
  }
`;

/* 컴포넌트에 애니메이션 효과 적용 */
const Box = styled.div`
  height: 200px;
  width: 200px;
  background-color: tomato;
  animation: ${rotatioAnimation} 1s linear infinite;
`;

function App() {
  return (
    <Wrapper>
      <Box />
    </Wrapper>
  );
}

export default App;
  • keyframes 를 import 받는다.

 

7-1)  애니메이션을 다른 화면에 사용

export const rotatioAnimation = keyframes`
  from {
    transform:rotate(0deg);
    border-radius:0px;
  }
  to {
    transform:rotate(360deg);
    border-radius:50px;
  }
`;
  • export를 해주면 다른 곳에서 import 받아 사용할 수 있다.

 

 

 


8. Style 컴포넌트 내부 태그 속성 주기

import styled from "styled-components";

const Box = styled.div`
  height: 200px;
  width: 200px;
  span {
    font-size: 36px;
		&:hover {
      font-size: 40px;
    }
  }
`;
function App() {
  return (
      <Box>
        <span>😆</span>
      </Box>
  );
}

export default App;
  • Box 컴포넌트의 내부 태그 타켓 가능
  • & : 태그를 선택하는것과 같은 의미

 

 

 


9. Pseudo Selector 

import styled from "styled-components";

const Emoji = styled.p`
  font-size: 30px;
`;

const Box = styled.div`
  height: 200px;
  width: 200px;
  ${Emoji} {
    &:hover {
      font-size: 40px;
    }
  }
`;

function App() {
  return (
    <Wrapper>
      <Box>
        <Emoji>😆</Emoji>
      </Box>
    </Wrapper>
  );
}

export default App;
  • Box 컴포넌트 안에 Emoji라는 컴포넌트를 줌으로써 Emoji가 어떤 태그이던 타깃 하여 css가 적용되게 만들 수 있다.
반응형

'React' 카테고리의 다른 글

[ReactTS] React TypeScript 프로젝트 생성 방법  (0) 2022.08.20
[ReactTS] TypeScript란?  (0) 2022.08.20
[ReactJS] React Router  (0) 2022.08.17
[ReactJS] useEffect  (0) 2022.08.16
[ReactJS] React 설치(node.js, npx) 및 실행  (0) 2022.08.14