๐ styled-components๋?
์คํ์ผ์ด ์ง์ ๋ html ์์(element)๋ค์ React ์ปดํฌ๋ํธ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ Node.js ํจํค์ง
React๋?
styled-components ์ฅ์
html ํ๊ทธ๋ฅผ ์์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค. ( styled-components๋ก ์ง์ ๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ๋ฉด๋จ )
styled-components ์ค์น
// javascript
npm i styled-components
// typescript
npm i @types/styled-components
vscode ์ค์ ( ํ์ฅ ํ๋ก๊ทธ๋จ ์ค์น ) /
๐ styled-components ์ฌ์ฉ (js)
import styled from 'styled-components'
// ์คํ์ผ์ด ์ง์ ๋ component๋ง๋ค๊ธฐ
// html์์์ ์คํ์ผ์ ์ ์ฅํด, componentํ์์ผ๋ก ์ฌ์ฉํ๋ค!
const Title = styled.h1`
font-size: 1.5em;
text-align: center;
/* ๋ณ์ ๋ฐ์์์, ์ฌ๋ฌ๊ฐ์ง ๊ธฐ๋ฅ ์ฌ์ฉ๊ฐ๋ฅ */
color: ${(props) => props.color};
${(props) =>
props.color
? css`
font-size: 49px;
`
: css`
text-decoration: underline;
`
}
`;
// ์ปดํฌ๋ํธ ์ด๋ฏ๋ก, props๋ฅผ ๋ฐ์์ฌ ์ ์๋ค!
const Wrapper = styled.section`
padding: 4em;
background: papayawhip;
`;
render(
<Wrapper>
<Title color="red">
Hello World!
</Title>
</Wrapper>
);
styled-components ์ฌ์ฉ (ts)
import styled from 'styled-components'
// ์ฌ์ฉํ ๋ณ์์ ํ์
์ง์ ํด์ฃผ๊ธฐ ( ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํด์ฃผ์ด๋ ๋จ )
type Colors = {
color: string;
};
// ์ธํฐํ์ด์ค ์ฌ์ฉํด์ ์ง์ ํ๋ ๋ฒ ( ๋์ค์ ํ๋๋ง ์ ํ )
interface Colors {
color: string;
};
// ์คํ์ผ์ด ์ง์ ๋ component๋ง๋ค๊ธฐ
// ์ปดํฌ๋ํธ ๋ด๋ถ์ ์ฌ์ฉ๋ ๋ณ์์ ํ์
์ด ์ฌ์ฉ๋์์์ ์๋ ค์ฃผ๊ธฐ
const Title = styled.h1<Colors>`
font-size: 1.5em;
text-align: center;
color: ${props => props.color};
${(props) =>
props.color
? `
font-size: 49px;
`
: `
text-decoration: underline;
`
}
`;
// ์ปดํฌ๋ํธ ์ด๋ฏ๋ก, props๋ฅผ ๋ฐ์์ฌ ์ ์๋ค!
const Wrapper = styled.section`
padding: 4em;
background: papayawhip;
`;
render(
<Wrapper>
<Title color="red">
Hello World!
</Title>
</Wrapper>
);
styled-components ๋ก ํ ๋ง์ค์ ํ๊ธฐ
1. javascript
// App.js - react_project
// ํ
๋ง ์ค์ ํ๊ธฐ ์ํ ThemeProvider ๋ถ๋ฌ์ค๊ธฐ
import { ThemeProvider } from "styled-components";
// ๋คํฌ๋ชจ๋ ํ
๋ง ์ค์ ํ๊ธฐ
const lightTheme = {
fontColor: "#2c2c2c",
bgColor: "lightgray",
}
// ์ผ๋ฐ๋ชจ๋ ํ
๋ง ์ค์ ํ๊ธฐ
const darkTheme = {
fontColor: "lightgray",
bgColor: "#2c2c2c",
}
function App() {
const isLoggedIn = useReactiveVar(isLoggedInVar);
const darkMode = useReactiveVar(darkModeVar);
// ThemeProvider๋ก ์ ์ฒด ์ปดํฌ๋ํธ ๊ฐ์ธ๊ธฐ, theme์์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ
๋ง ์ ์ฉํด์ฃผ๊ธฐ
return (
<ThemeProvider theme={darkMode ? darkTheme : lightTheme}>
...
</ThemeProvider>
);
}
export default App;
2. typescript
ํ์ ์ ์ธ ํ์ผ ๋ง๋ค์ด์ฃผ๊ธฐ
// styled.d.ts - ์๋ฌด์ด๋ฆ์ด๋ ์๊ด์์ (.d.ts ํ์ฅ์๋ง ์ ์ง )
// styled-components ๋ถ๋ฌ์ค๊ธฐ
import 'styled-components';
// styled-components์์ ๋ค์ด์๋ DefaultTheme ํ์ ์ง์ ํด์ฃผ๊ธฐ
declare module 'styled-components' {
export interface DefaultTheme {
// ์ฌ์ฉํ ์์ ํ์ ์ง์
fontColor: string;
bgColor: string;
}
}
์ ์ธํ ํ์์ ๋ง์ถฐ ํ ๋ง ๋ง๋ค๊ธฐ
// App.js - react_project
// ํ
๋ง ํ์ ๋ถ๋ฌ์ฌ DefaultTheme,ํ
๋ง ์ค์ ํ๊ธฐ ์ํ ThemeProvider ๋ถ๋ฌ์ค๊ธฐ
import { DefaultTheme, ThemeProvider } from "styled-components";
// ๋คํฌ๋ชจ๋ ํ
๋ง๋ฅผ DefaultTheme ํ์์ ๋ง๊ฒ ์์ฑํ๊ธฐ
const lightTheme : DefaultTheme = {
fontColor: "#2c2c2c",
bgColor: "lightgray",
}
// ์ผ๋ฐ๋ชจ๋ ํ
๋ง๋ฅผ DefaultTheme ํ์์ ๋ง๊ฒ ์์ฑํ๊ธฐ
const darkTheme : DefaultTheme = {
fontColor: "lightgray",
bgColor: "#2c2c2c",
}
function App() {
const isLoggedIn = useReactiveVar(isLoggedInVar);
const darkMode = useReactiveVar(darkModeVar);
return (
<ThemeProvider theme={darkMode ? darkTheme : lightTheme}>
...
</ThemeProvider>
);
}
export default App;
์ปดํฌ๋ํธ ํ์ฅ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ฏธ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉํ๊ธฐ
ํ์ฅ(extend)๊ธฐ๋ฅ ์ฌ์ฉ์
const TopBox = styled.div`
background-color: white;
border-color: rgb(219, 219, 219);
padding: 30px 40px 23px 40px;
margin-top: 95px;
margin-bottom: 10px;
`;
const NomalBox = styled.div`
background-color: white;
border-color: rgb(219, 219, 219);
padding: 23px 90px 23px 90px;
`;
ํ์ฅ ๊ธฐ๋ฅ ์ฌ์ฉํ ( ์ค๋ณต ์ ๊ฑฐ )
const WhiteBox = styled.div`
background-color: white;
border-color: rgb(219, 219, 219);
`;
// styled()๋ก ๊ธฐ์กด์ ์คํ์ผ ์ปดํฌ๋ํธ ํ์ฅํด์ ์ฌ์ฉํ๊ธฐ
const TopBox = styled(WhiteBox)`
padding: 30px 40px 23px 40px;
margin-top: 95px;
margin-bottom: 10px;
`;
const NomalBox = styled(WhiteBox)`
padding: 23px 90px 23px 90px;
`;
๋ฐ์ํ