WEB/ReactJS

[React] 리액트 styled-components

다콩잉 2023. 6. 26. 14:04

 

💡 styled-components는 React에서 스타일을 적용하기 위한 강력한 라이브러리입니다. 이를 사용하면 JavaScript 코드 내에서 CSS 스타일을 작성하고 컴포넌트에 적용할 수 있습니다.

 

install

npm i styled-components

 

 

styled-components install error

  • styled-compoennts  intsall 시에 아래와 같은 error를 마주한다면
npm ERR! Cannot read properties of null (reading 'edgesOut')
  • 다음과 같이 해결
npm install styled-components@latest

// or yarn 사용

yarn install styled-components

 

 

styled-components 기본 사용법

  • styled.div``과 같은 방식으로 컴포넌트를 생성하고, 속성을 전달할 수 있습니다.
import styled from "styled-components";

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

const Boxone = styled.div`
    width: 100px;
    height: 100px;
`;

 

 

Props

props 사용법

  • 전달한 속성은 ${(props) => props.bgColor}와 같은 방식으로 스타일 내에서 참조할 수 있습니다.
import styled from "styled-components";

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

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

style 상속

  • styled.div``과 같이 스타일이 적용된 기존 컴포넌트를 상속하여 새로운 컴포넌트를 생성할 수 있습니다.
const Box = styled.div`
    background-color: teal;
    width: 100px;
    height: 100px;
`;

const Circle = styled(Box)`
    border-radius: 5px;
`;

HTML 태그 대체

  • as 속성을 사용하여 컴포넌트를 다른 HTML 태그로 대체할 수 있습니다.
function App(){
	return (
		<Btn>Button Tag</Btn>
		<Btn as="a" href="/">A tag</Btn>
	);
}

const Box = styled.div`
    color: white;
		background-color: blue;
`;

속성 설정

  • styled.input.attrs({ required: true, minLength: 10 })와 같이 attrs 메소드를 사용하여 속성을 설정할 수 있습니다.
const Input = styled.input.attrs({ required: true, minLength: 10 })`
	background-color: tomato;
`

 

 

 

Animation

  • keyframes를 사용하여 애니메이션을 정의하고, animation 속성을 통해 컴포넌트에 애니메이션을 적용할 수 있습니다.
import styled, {keyframes} from "styled-components";

const animation = keyframes`
	from {
		transform: rotate(0deg);
	}
	to {
		transform: rotate(360deg);
	}
`

const Box = styled.div`
	height: 200px;
	width: 200px;
	background-color: tomato;
	animation: ${animation} 1s linear infinite;
	${Emoji} {
		&:hover {
			font-size: 98px;
		}
	}
`

const Emoji = styled.span`
	font-size: 36px;
`

 

 

 

ThemeProvider

  • ThemeProvider 컴포넌트를 사용하여 테마를 설정할 수 있습니다. 이를 통해 컴포넌트 내에서 테마에 따라 스타일을 다르게 적용할 수 있습니다.

index.js

import React from "react";
import ReactDOM from "react-dom/client";
import { ThemeProvider } from "styled-components";
import App from "./App";

const darkTheme = {
    textColor: "whitesmoke",
    backgroundColor: "#111",
};
const lightTheme = {
    textColor: "#111",
    backgroundColor: "whitesmoke",
};

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
    <React.StrictMode>
        <ThemeProvider theme={darkTheme}>
            <App />
        </ThemeProvider>
    </React.StrictMode>
);

App.js

import styled from "styled-components";

const Text = styled.span`
	color: ${(props) => props.theme.textColor};
`;
728x90