화면에 컴포넌트가 렌더링 되었는지 추적하여 컴포넌트에 대한 스타일을 자동으로 삽입하여 줍니다. 코드를 적절히 분배해 놓으면 최소한의 코드만으로 화면이 띄워질 수 있습니다.
스타일에 대한 고유한 클래스 이름을 생성합니다. 중복 또는 철자 오류에 대해 걱정할 필요가 없습니다.
코드베이스 어딘가에서 클래스 이름이 사용되는지에 대한 여부를 알기 어려울 수 있습니다. 하지만 styled-components를 사용하면 모든 스타일링이 특정 구성 요소에 연결되어 있으므로 이를 명확하게 알 수 있고, 구성 요소가 사용되지 않아 삭제를 하면 모든 스타일도 함께 삭제 됩니다.
수십 개의 클래스를 수동으로 관리할 필요 없이 전역 테마를 기반으로 구성 요소의 스타일을 조정할 수 있습니다.
구성 요소에 영향을 미치는 스타일을 찾기 위해서 여러 파일을 검색할 필요가 없고 코드 베이스가 아무리 크더라도 유지관리가 쉽습니다.
개별 컴포넌트마다 기존의 CSS를 이용하여 스타일 속성을 정의하면 됩니다. 이외의 것들은 Styled-Components가 알아서 처리해줍니다.
CSS-IN-JS 방식으로 컴포넌트가 렌더링 될 때만 해당 스타일 정보를 읽습니다.
동적인 이벤트가 많은 사이트라면 컴포넌트가 자주 렌더링 될 때 그만큼 스타일 정보도 다시 읽어와야 합니다. CSS-IN-CSS는 이미 HTML 문서에 읽혀져 있는 상태이기 때문에 처음에는 스타일 정보를 가져오는 양이 많더라도 그 후 추가적인 렌더링은 상대적으로 styled-component보다 적습니다.
npm i styled-component
import styled from 'styled-components';
먼저 styled-components 를 사용하기 위해서 사용할 페이지 상단에 import 해줍니다.
const Title = styled.h1`
font-size: 1.5em;
text-align: conter;
color: red;
`;
const Wrapper - styled.section`
padding : 4em;
background : white;
`;
render(
<Wrapper>
<Title>
Hello World!
</Title>
</Wrapper>
);
const Button = styled.button`
background : ${props => props.primary ? "black" : "white"};
color : ${props => props.primary ? "white" : "black"}
`;
render(
<div>
<Button>Normal</Button>
<Button primary>Primary</Button>
</div>
);
const button = styled.button`
background : red;
`;
const button2 = styled.button`
background : blue;
`;
function App() => {
return (
<section>
<button>버튼1</button>
<button2>버튼2</button2>
</section>
)
}
const button = styled.button`
background : ${props => props.background};
`;
function App() => {
return (
<section>
<button background="red">버튼1</button>
<button background="blue">버튼2</button>
</section>
)
}
const button = styled.button`
background : ${props => props.background || "red"};
`;
function App() => {
return (
<section>
<button>버튼1</button>
<button background="blue">버튼2</button>
</section>
)
}
red
로 주고, 다른 색을 background 색으로 바꾸고 싶을 때는 태그에 props를 주면 준 색으로 색이 바뀌게 됩니다.const MainImage = styled.img`
width: 100px;
height: 100px;
`
function ProductItem() {
return (
<MainContainer>
<MainImage src='https://*****' alt='제품 이미지' />
<MainImage src='https://*****2' alt='제품 이미지' />
<MainImage src='https://*****3' alt='제품 이미지' />
</MainContainer>
)
}
const MainImage = styled.img`
width: 100px;
height: 100px;
`
function ProductItem({alt="제품이미지"}) {
return (
<MainContainer>
<MainImage src='https://*****' />
<MainImage src='https://*****2' />
<MainImage src='https://*****3' />
</MainContainer>
)
}
내가 button에 대한 새로운 스타일링을 하기위해 새롭게 컴포넌트를 만들려고 하는데 만들어두었던 스타일 컴포넌트의 내용을 대부분 가져와야하는 경우가 있을 수 있습니다. 기존에 생성했었던 속성들에 border만 추가 된다거나 border-radius 만 추가된다거나 하는 일 말입니다.
이 때, 그 전의 컴포넌트의 요소를 참조하는 확장된 컴포넌트를 만들 수 있는 방법이 있습니다.
const Button = styled.button`
width: 100px;
height : 100px;
`;
function App() => {
return (
<section>
<Button>버튼1</Button>
</section>
)
}
const Button = styled.button`
width: 100px;
height : 100px;
`;
const BorderButton = styled(Button)`
border: 1px solid #fff;
`
function App() => {
return (
<section>
<Button>버튼1</Button>
</section>
)
}
const MainContainer = styled.section`
display:flex;
width:100vw;
`
const Memo = styled.div`
width:300px;
height:500px;
`
const ShadowMemo = styled(Memo)`
box-shadow: 2px 4px 8px;
`
funtion Section2 () {
return(
<>
<MainContainer>
<Memo>Lorem Ipsum</Memo>
<ShadowMemo>Lorem Ipsum</ShadowMemo>
</MainContainer>
<Memo>Lorem Ipsum</Memo>
</>
)
}
const Memo = styled.div`
width:300px;
height:500px;
`
const MainContainer = styled.section`
display:flex;
width:100vw;
${Memo} {
background-color:black;
color: white;
}
`
const ShadowMemo = styled(Memo)`
box-shadow: 2px 4px 8px;
`
funtion Section2 () {
return(
<>
<MainContainer>
<Memo>Lorem Ipsum</Memo>
<ShadowMemo>Lorem Ipsum</ShadowMemo>
</MainContainer>
<Memo>Lorem Ipsum</Memo>
</>
)
}
${ }
를 사용하여 select하고, MainContainer의 하위 요소의 Memo에만 스타일을 부가할 수 있습니다.