r e a c t
styled components / 조건부 스타일
hee.hee
2022. 7. 11. 19:56
const FormControl = styled.div`
margin: 0.5rem 0;
& label {
font-weight: bold;
display: block;
margin-bottom: 0.5rem;
}
& input {
display: block;
width: 100%;
border: 1px solid #ccc;
font: inherit;
line-height: 1.5rem;
padding: 0 0.25rem;
}
& input:focus {
outline: none;
background: #fad0ec;
border-color: #8b005d;
}
&.invalid input {
border-color: red;
background: #ffd7d7;
}
&.invalid label {
color: aquamarine;
}
`;
FormControl 컴포넌트이다.
isValid state가 flase일 때 스타일이 추가 되어야하는 상황이다.
두가지 방법이 있다.
첫번째 방법은 클래스 네임을 사용하는 것
클래스 네임을 &.invalid로 설정해, 조건(isValid가 false)을 만족할 때만 스타일을 추가
return (
...
<FormControl className={!isValid && "invalid"}> // 클래스네임이 조건부로 생성된다
</FormControl>
)
두번째 방법은 prop를 사용하는 것
return (
...
<FormControl invalid={!isValid}>
</FormControl>
)
invalid라는 이름의 props를 줬다. !isValid가 true인 경우 / false인 경우를 활용할 수 있다.
props로 준 것은 위의 컴포넌트 스타일을 만드는 코드를 감싼 `백틱` 사이에, 조건부로 하고싶은 스타일을 지정하는 코드에서 쓰인다.
...
& label {
font-weight: bold;
display: block;
margin-bottom: 0.5rem;
color: ${props => props.invalid ? 'red' : 'aquamarine'}
}
& input {
display: block;
width: 100%;
border: 1px solid ${props => (props.invalid ? 'red' : '#ccc')};
background: ${props => (props.invalid ? '#ffd7d7' : 'transparent')}
font: inherit;
line-height: 1.5rem;
padding: 0 0.25rem;
}
// 이제 아래 코드는 필요 없다
// &.invalid input {
// border-color: red;
// background: #ffd7d7;
// }
// &.invalid label {
// color: aquamarine;
// }
& label에서 props의 invalid가 true인 경우, 아닌 경우에 따라 스타일을 다르게 내려준다.
& input에서 props의 invalid가 true인 경우, 아닌 경우에 따라 스타일을 다르게 내려준다.
주석처리된 부분의 코드를 대체하고 있다(물론, 이 전 과정에서처럼, FormControl 컴포넌트에 props를 줘야 한다)
이렇게 해주면, isValid가 false인 상태에서는 아래처럼 나온다.
요 아래는 isValid가 true인 상태