: CSS๋ฅผ ์ปดํฌ๋ํธํ ์ํด์ผ๋ก์จ CSS ์ฝ๋์ ๋ถํธํจ์ ํด๊ฒฐํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉด CSS๋ JavaScript ์์ ๋ฃ์ด์ค ์ ์์ผ๋ฏ๋ก, HTML + JS + CSS๊น์ง ๋ฌถ์ด์ ํ๋์ JSํ์ผ ์์์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ ์ ์๋ค.
npm install styled-components
{
"resolution": {
"styled-components": "^5"
}
}
import styled from "styled-components';
const ์ปดํฌ๋ํธ๋ช
= styled.ํ๊ทธ์ข
๋ฅ`
// ์ฌ๊ธฐ์ CSS ์ฝ๋ ์์ฑ
`;
styled.ํ๊ทธ์ข
๋ฅ
๋ฅผ ํ ๋นํ๊ณ , ๋ฐฑํฑ(`) ์์ CSS ๋ฌธ๋ฒ์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.const BlueButton = styled.button`
background-color: blue;
color: white;
padding: 15px;
border: none;
border-radius: 15px;
`;
// ์๋ต
return (
<BlueButton>Click Me</BlueButton>
);
์ด๋ฏธ ๋ง๋ค์ด์ง ์ปดํฌ๋ํธ๋ฅผ ์ฌํ์ฉํด์ ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
const ์ปดํฌ๋ํธ๋ช
= styled(์ฌํ์ฉํ ์ปดํฌ๋ํธ)`
// ์ถ๊ฐํ CSS ์์ฑ
`;
const GreenButton = styled(BlueButton)`
background-color: green;
`;
Styled Components๋ก ๋ง๋ ์ปดํฌ๋ํธ๋ React ์ปดํฌ๋ํธ์ฒ๋ผ props๋ฅผ ๋ด๋ ค์ค ์ ์์ผ๋ฉฐ, ๋ด๋ ค์ค props ๊ฐ์ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ค.
const ์ปดํฌ๋ํธ๋ช
= styled.ํ๊ทธ์ข
๋ฅ`
CSS์์ฑ: ${(props) => ํจ์ ์ฝ๋}
`;
${ }
)์ ์ฌ์ฉํด์ JavaScript ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํ ์ ์๋ค.
const Button = styled.button`
width: ${(props) => props.big ? "120px" : "80px"};
`;
// ์๋ต
return (
<>
<Button>Button 1</Button>
<Button big>Button 2</Button>
</>
);
// ์ค๊ดํธ{}๋ฅผ ์ด์ฉํด ํน์ props๋ง ๋ถ๋ฌ์ฌ ์๋ ์๋ค.
width: ${({big}) => big ? "120px" : "80px"};
// ์กฐ๊ฑด๋ฌธ ์ ์ฒด๋ฅผ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ก ์์ฑํ ์๋ ์๋ค.
${(props) => props.big ? "width: 120px" : "width: 80px"}
props ๊ฐ์ ํต์งธ๋ก ํ์ฉํด์ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ์ฉํ ์ ์๋ค.
const Button = styled.button`
background-color: ${(props) => props.color ? props.color : "lightgrey"};
`;
// ์๋ต
return (
<>
<Button color="blue">Button 1</Button>
<Button color="green">Button 2</Button>
<Button>Button 3</Button>
</>
);
์ผํญ์ฐ์ฐ์ ๋์ OR ์ฐ์ฐ์(||
)๋ ์ฌ์ฉํ ์ ์๋ค.
JavaScript ์ฝ๋๋ผ๋ฉด ๋ฌด์์ด๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํจ์ ์ฝ๋๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ฉด ๋๋ค.
const Button = styled.button`
background-color: ${(props) => props.color || "lightgrey"};
// OR ์ฐ์ฐ์๋ ๋ ์ค์ ํ๋๋ ์ฐธ์ด์ด์ผ ํ๋ฏ๋ก, props.color๊ฐ ์กด์ฌํ์ง ์๋๋ค๋ฉด lightgrey๊ฐ ๋๋ค.
`;
์ ์ญ ์คํ์ผ์ ์ค์ ํ๊ณ ์ถ๋ค๋ฉด createGlobalStyle
ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
import { createGlobalStyle } from "styled-components";
createGlobalStyle
ํจ์๋ฅผ ํ ๋นํ๊ณ , CSS ํ์ผ์์ ์์ฑํ๋ฏ์ด ์ ์ญ์ ์ง์ ํด์ฃผ๊ณ ์ถ์ ์คํ์ผ์ ์์ฑํ๋ค.const GlobalStyle = createGlobalStyle`
button {
margin: 10px;
box-shadow: inset 0px -3px rgba(0, 0, 0, 0.5)
}
`;
// ์๋ต
return (
<>
<GlobalStyle /> // ์ต์์ ์ปดํฌ๋ํธ์ ์์ฑ
<Button color="blue">Button 1</Button>
<Button color="green">Button 2</Button>
<Button>Button 3</Button>
</>
);
The component styled.div with the id of "___" has been created dynamically. You may see this warning because you've called styled inside another component. To resolve this only create new StyledComponents outside of any render method and function component.
๋ด๊ฐ ๋ ๋ฒ์ด๋ ๋ฒํ ์ค๋ฅ๋ก.. styled component๋ฅผ ์ ์ํ ๋, ํจ์ํ ์ปดํฌ๋ํธ ์์์ ์ ์ํ๋ ๊ฒ ์๋๋ผ, ๋ฐ์ ์ ์ํด์ค์ผ ํ๋ค.
___๋ผ๋ id๋ฅผ ๊ฐ์ง styled div ์ปดํฌ๋ํธ๊ฐ ๋์ ์ผ๋ก ์์ฑ๋์์ต๋๋ค.
๋น์ ์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ ์์ styled๋ฅผ ํธ์ถํ์ ๋ ์ด ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ ๊ฒ์
๋๋ค.
์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ๋ ๋ ๋ฉ์๋๋ ํจ์ ์ปดํฌ๋ํธ "๋ฐ๊นฅ์" styled ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ญ์์ค.
const Wrapper = styled.section`
height: 100vh;
background-color: #d6e4e5;
display: flex;
justify-content: center;
align-items: center;
`;
const Conatiner = styled.div`
width: 100%;
max-width: 500px;
min-width: 300px;
border-radius: 5px;
background-color: white;
position: relative;
box-shadow: 0px 20px 40px rgba(82, 97, 107, 0.2);
`;
export default function App() {
/* ์ด ์์์ const ~ styled ์ปดํฌ๋ํธ ์ ์ธํ ๊ฒฝ์ฐ ํด๋น ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค. */
return (
<Wrapper>
<Conatiner>
{data.map((d) => (
<Menu key={d.city} city={d.city} description={d.description} />
))}
</Conatiner>
</Wrapper>
);
}
์ถ์ฒ : https://github.com/styled-components/styled-components/issues/3117