티스토리 뷰
state를 이용해서 스타일링을 다르게 주고 싶어서 스타일드 컴포넌트에 props를 넘겨 줬다.
const BirthdayCake = () => {
const [btnSize, setBtnSize] = useState(false);
const [candleFlame, setCandleFlame] = useState(true);
const [flameUrl, setFlameUrl] = useState('images/flame1.png');
useEffect(() => {
if (!candleFlame) {
setBtnSize(false);
setFlameUrl('');
return;
}
const btnSizeTime = setInterval(() => {
setBtnSize((prev) => !prev);
}, 700);
const flameUrlTime = setInterval(() => {
setFlameUrl(url[Math.floor(Math.random() * url.length)]);
}, 300);
return () => {
clearInterval(btnSizeTime);
clearInterval(flameUrlTime);
};
}, [candleFlame]);
const handleCandleFlame = () => {
setCandleFlame(false);
};
return (
<Cake>
<CandleFlame flameUrl={flameUrl}>
{!candleFlame && (
<h1>
<br />
💕 친구야 💕
<br />
생일 축하해 🎉
</h1>
)}
<BlowBtn btnSize={btnSize} onClick={handleCandleFlame}>
{!candleFlame ? '생일 축하해' : '촛불 끄기'}
</BlowBtn>
</CandleFlame>
</Cake>
);
};
export default BirthdayCake;
const BlowBtn = styled.button`
...
box-shadow: 0 4px 6px rgba(50, 50, 93, 0.3), 0 1px 3px rgba(0, 0, 0, 0.1);
transform: ${({ btnSize }) => (btnSize ? 'scale(1)' : 'scale(1.2)')};
transition: 0.3s;
...
`;
const CandleFlame = styled.div`
width: inherit;
height: inherit;
padding: 80px;
background: ${({ flameUrl }) => `no-repeat bottom/150% url(${flameUrl})`};
`;
그런데 빨간줄이 좍좍 뜨는게 아닌가....😨 또.. 왜요......🥺 찾아보니 스타일드 컴포넌트에도 타입을 정해줘야했다.
타입을 선언해주고 스타일드 컴포넌트에 타입을 정해주면 된다.
interface BtnSize {
btnSize: boolean;
}
interface FlameUrl {
flameUrl: string;
}
const BlowBtn = styled.button<BtnSize>`
...
box-shadow: 0 4px 6px rgba(50, 50, 93, 0.3), 0 1px 3px rgba(0, 0, 0, 0.1);
transform: ${({ btnSize }) => (btnSize ? 'scale(1)' : 'scale(1.2)')};
transition: 0.3s;
...
`;
const CandleFlame = styled.div<FlameUrl>`
width: inherit;
height: inherit;
padding: 80px;
background: ${({ flameUrl }) => `no-repeat bottom/150% url(${flameUrl})`};
`;
넘겨주는 props가 하나라면 이렇게 할 수도 있다.
${({ props이름 }: { props이름 : 타입 }) => ...
const setColor = () => {
if (textValue.length < 100) {
return '#00B388';
} else if (textValue.length < 120) {
return '#FAB922';
} else {
return '#FA3270';
}
};
...
<NoticeCurcle noticeColor={setColor()} />
...
const NoticeCurcle = styled.span`
display: inline-block;
width: 0.5rem;
height: 0.5rem;
border-radius: 50%;
background-color: ${({ noticeColor }: { noticeColor: string }) =>
noticeColor};
transform: translateY(-2px);
`;
728x90
'TIL' 카테고리의 다른 글
TIL 221125 Redirect URI가 뭔데(feat. 카카오 로그인) + GitHub 잔디 색상 기준은 뭘까 (0) | 2022.11.25 |
---|---|
TIL 221120 tsconfig (0) | 2022.11.20 |
TIL 221118 컴포넌트를 나누는 기준 + Enable text compression (0) | 2022.11.19 |
TIL 221117 회원가입 유효성 검사에 정규 표현식 쓰기 (0) | 2022.11.18 |
TIL 221115 lighthouse(라이트하우스) 써보기 (0) | 2022.11.15 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- React
- 비주얼스튜디오코드
- vue
- 김버그
- 저스트코드
- js
- scss
- git
- html
- 회고
- 드림코딩
- 리액트
- 깃
- 코드잇
- vscode
- 구름에듀
- 제이쿼리
- 코딩앙마
- javascript
- Til
- Typescript
- 제로초
- 자바스크립트
- 타입스크립트
- 스파르타코딩클럽
- Python
- 파이썬
- CSS
- map
- TS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함