평소 scss를 그냥 css 쓰듯 써서(..) 프로젝트 무게도 낮출 겸 TS 적용 겸 styled-components로 교체해봤습니다.
글로벌 스타일, 초기값들을 정의합니다. css 파일이 아닌 JS 안에서 스타일을 정의하기 때문에 별도의 방법으로 적용합니다.
yarn add styled-reset
// Gl
import { createGlobalStyle } from "styled-components";
import reset from "styled-reset";
const globalStyles = createGlobalStyle`
// css 초기값 정의
${reset};
// 따로 스타일링
a{
text-decoration:none;
color:inherit;
}
*{
box-sizing:border-box;
}
`;
export default globalStyles;
import GlobalStyles from "./GlobalStyles";
const App = () => {
return (
<>
// App.tsx에 글로벌 스타일 적용
<GlobalStyles />
</>
);
};
일반적인 scss를 사용한다면 className에 조건부로 className을 선언해 조건부 스타일링을 할 수 있지만 styled-component에서는 props를 전달해 간편하게 조건부 스타일링을 할 수 있습니다.
// Navbar 컴포넌트
const NavBar:FC<NavBarProps> = ({ path }) => {
return (
// ul 태그
<NavBarContainer>
1️⃣<ListContainer clicked={path === "/"} detailClicked={false}>
<Link to="/">
<img src={Home} alt="Home" />
<p>홈</p>
</Link>
</ListContainer>
</NavBarContainer>
)
ListContainer
에 boolean
형 clicked
라는 props를 스타일에 넘겨줄 수 있습니다.1️⃣interface ListContainerProps {
clicked : boolean;
}
export const ListContainer = 2️⃣styled.li<ListContainerProps>`
img {
padding: 7px 0 2px 0;
padding-bottom: 5px;
3️⃣filter: ${(props) =>
props.clicked
? `invert(68%) sepia(85%) saturate(4997%) hue-rotate(333deg) brightness(102%) contrast(107%)`
: null};
}
4️⃣color: ${(props) => (props.clicked ? `#fc5c42` : `#767676`)};
`;
interface
로 타입을 지정해도 되고 props가 하나인 경우엔 변수 바로 옆에 지정해도 됩니다.clicked
의 boolean형 값에 따라 스타일을 지정합니다. if문을 사용해도 되고 3항연산자를 사용해도 됩니다.