- 프로그래머스 알고리즘 풀기
- Styled-Components 공부하기
- Redux, React-Router-Dom 스파르타코딩클럽 강의 다시보기
- TodoList 기본 과제 안보고 만들기
- TodoList 기본 과제 Styled-Components를 사용하여 만들기
styled-components란 Javascript 파일 내에서 CSS를 사용할 수 있게 해주는 대표적인 CSS-in-JS 라이브러리로 React 프레임워크를 주요 대상으로 한 라이브러리이다.
$ npm install --save styled-components
import styled from "styled-components";
const Father = styled.div`
display: flex;
`;
const Box = styled.div`
background-color: ${(props) => props.bgColor};
width: 100px;
height: 100px;
`;
// 박스의 모든 속성을 복사하고 나머지 속성을 추가해준다.
const Circle = styled(Box)`
border-radius: 50px;
`;
const Btn = styled.button`
color: white
background-color: tomato;
border: 0;
border-radius: 15px;
`;
// 속성값을 기본적으로 부여해준다.
const Input = styled.input.attrs({ required: true, minLength: 10 })`
background-color: tomato;
`;
// as 속성을 쓰면 html 태그를 같은 스타일을 적용하며 바꿀 수 있다.
function App() {
return (
<Father>
<Box bgColor="teal" />
<Circle bgColor="tomato" />
<Btn>Log in</Btn>
<Btn as="a" href="/">
Home
</Btn>
<Input />
</Father>
);
}
export default App;
import React from "react";
import { keyframes } from "styled-components";
import styled from "styled-components";
const Wrapper = styled.div`
display: flex;
`;
const rotationAnimation = keyframes`
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
`;
const Emoji = styled.span`
font-size: 30px;
`;
// 애니메이션 주는 방법, 박스안에 있는 span 태그에 스타일 주는 방법
const Box = styled.div`
height: 200px;
width: 200px;
background-color: tomato;
animation: ${rotationAnimation} 1s linear infinite;
${Emoji} {
&:hover {
font-size: 40px;
}
&:active {
opacity: 0;
}
}
`;
// 박스 밖의 Emoji는 hover, active 효과를 받을 수 없다.
export default function Test() {
return (
<div>
<Wrapper>
<Box>
<Emoji>😄</Emoji>
</Box>
<Emoji>😄</Emoji>
</Wrapper>
</div>
);
}
import React from "react";
import styled from "styled-components";
const StBox = styled.div`
width: 100px;
height: 100px;
border: 1px solid ${(props) => props.borderColor};
margin: 20px;
`;
const boxList = ["red", "green", "blue"];
const getBoxName = (color) => {
switch (color) {
case "red":
return "빨간 박스";
case "green":
return "초록 박스";
case "blue":
return "파란 박스";
default:
return "검정 박스";
}
};
const App = () => {
return (
<div>
{/* map 으로 돌려서 StBox 컴포넌트를 생성한다.
boxColor = "red", "green", "blue"
borderColor = "red", "green", "blue"
getBoxName 에 "red", "green", "blue" 를 보내준다.
getBoxName 이 "red", "green", "blue" 케이스에 맞게 문자를 반환한다. */}
{boxList.map((boxColor) => (
<StBox borderColor={boxColor}>{getBoxName(boxColor)}</StBox>
))}
</div>
);
};
export default App;
// index.js
import React from "react";
import ReactDOM from "react-dom/client";
import { ThemeProvider } from "styled-components";
import App from "./App";
import DarkMode from "./DarkMode";
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}>
<DarkMode />
</ThemeProvider>
</React.StrictMode>
);
// DarkMode.jsx
import React from "react";
import styled from "styled-components";
// DarkMode 컴포넌트가 ThemeProvider 안에 있기 때문에
// Theme object에 접근해서 textColor, backgroundColor을 얻을 수 있다.
const Title = styled.h1`
color: ${(props) => props.theme.textColor};
`;
export default function DarkMode() {
return (
<div>
<Title>Hi</Title>
</div>
);
}