JS ์์ CSS๊ฐ ์๋ค๋ ์๋ฏธ์ธ CSS in JS
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋๋ก, React์์ CSS๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ ๊ฐ์ง์ด๋ค.
์คํ์ผ์ ๋ํ ๊ณ ์ ํด๋์ค๋ช ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต์ด๋ ์คํ์ ๋ํ ๊ฑฑ์ ์ด ์๊ณ , Props์ ๋ฐ๋ผ ์คํ์ผ์ด ๋ฌ๋ผ์ง๊ฒ๋ ๊ฐ๋ณ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค.
$ npm i styled-components
์ปค๋งจ๋ ์ฐฝ์ ์์ ๊ฐ์ด ์ ๋ ฅํด ํจํค์ง๋ฅผ ์ค์นํด ์ค๋ค.
import styled from "styled-components";
์ค์น๊ฐ ๋์๋ค๋ฉด Styled Components๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด styled-components
ํจํค์ง์์ styled
ํจ์๋ฅผ importํ๋ค.
Styled Components๋ ๊ธฐ๋ณธ์ ์ผ๋ก html์ ๋ชจ๋ ํ๊ทธ๋ค์ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ค.
import styled from "styled-components";
const ๋ณ์์ด๋ฆ = styled.HTML์๋ฆฌ๋จผํธ`
// CSS ์คํ์ผ
`;
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ const ๋ณ์์ด๋ฆ =
๋ค์์ styled.div
, styled.button
๊ณผ ๊ฐ์ด ์์ฑํ๊ณ , ๋ฐฑํฑ ํ๊ทธ(``) ์์ CSS ์คํ์ผ์ ์์ฑํ๋ฉด ๋๋ค.
import styled from "styled-components";
const StyledSection = styled.div`
background-color: red;
display: flex;
justify-content: center;
`;
export default function Section() {
return <StyledSection></StyledSection>;
}
์๋ฅผ ๋ค์ด, ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๋ค!
์ด์ฒ๋ผ ์คํ์ผ์ด ์ ์ฉ๋ StyledSection
์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์๋ค.
const Title = styled.h1`
color: #aac9f0;
`;
์์ ๊ฐ์ Title
๋ณ์๊ฐ ์๋ค๊ณ ํ ๋, Title์ ์คํ์ผ์ ์์๋ฐ์ ๋ค๋ฅธ ๋ณ์๋ฅผ ๋ง๋ ๋ค๊ณ ํด ๋ณด์,
const SubTitle = styled(Title)`
font-size: 12px;
align-self: center;
`;
styled(๋ถ๋ชจ ๋ณ์)
์ ๊ฐ์ด ์์ฑํ๋ฉด ๋ถ๋ชจ ๋ณ์์ ์คํ์ผ์ ์์๋ฐ์ ์ ์๋ค!
import React from "react";
import styled from "styled-components";
const Section = styled.div`
background-color: beige;
border-radius: 15px;
`;
const Title = styled.h1`
color: #aac9f0;
`;
const SubTitle = styled(Title)`
font-size: 12px;
align-self: center;
`;
export default function Content() {
return (
<Section>
<Title>Section</Title>
<SubTitle>I am a SubTitle</SubTitle>
</Section>
);
}
(์ ์ฝ๋๊ฐ ์ ์ฉ์ด ๋ ๋ชจ์ต)
Styled Components๋ก ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ฐ์ Props์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํ ์ ์๋ค.
๋ฒํผ์ ์คํ์ผ์ด Props์ ๋ฐ๋ผ ๋ฐ๋๋๋ก ์ผํญ ์ฐ์ฐ์
๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
import React from "react";
import styled from "styled-components";
const StyledButton = styled.div`
background-color: ${({ primary }) => (primary ? "red" : "blue")};
display: flex;
justify-content: center;
height: 20px;
padding: 5px;
margin: 5px;
border-radius: 15px;
`;
export default function Button({ primary, text }) {
return <StyledButton primary={primary}>{text}</StyledButton>;
}
<Button />
์ปดํฌ๋ํธ์ ๋์ด์จ primary
์ text
Props๋ฅผ <StyledButton />
๋ก ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค. (<StyledButton />
์ด Props๋ฅผ ์ธ์ํ ์ ์๊ฒ ํ๊ธฐ ์ํด์์ด๋ค)
(<Button />
์ปดํฌ๋ํธ๋ฅผ <Content />
์ ๋ฃ์ ๋ชจ์ต, ๋นจ๊ฐ ์ ๋ฒํผ์ Primary Props๋ฅผ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๋ฒํผ)
์ถ์ฒ : https://velog.io/@sorious77/React-Styled-Components-์ฌ์ฉ-๋ฐฉ๋ฒ-e9o4rnfq, https://www.daleseo.com/react-styled-components/, https://nykim.work/107
ํผ๊ฐ์.. ^^