어느른,, React
와 TypeScript
를 사용해서 인증번호 3분 타이머를 구현해보자!
Timer.tsx
const MINUTES_IN_MS = 3 * 60 * 1000;
const INTERVAL = 1000;
const [timeLeft, setTimeLeft] = useState<number>(MINUTES_IN_MS);
MINUTES_IN_MS
: 3(몇분) 60(1분) 1000 (1초)INTERVAL
: 1초timeLeft
: number타입을 가지고 초기값은 MINUTES_IN_MS
으로 가진다.useEffect
함수 작성하기 useEffect(() => {
const timer = setInterval(() => {
setTimeLeft((prevTime) => prevTime - INTERVAL);
}, INTERVAL);
if (timeLeft <= 0) {
clearInterval(timer);
console.log('타이머가 종료되었습니다.');
}
return () => {
clearInterval(timer);
};
}, [timeLeft]);
setInterval
함수를 사용해 1초마다 1초씩 빼기!clearInterval
함수를 사용해 종료 시키기timeLeft
가 변할때마다 useEffect
가 실행되도록 의존성 배열에 입력해주기useEffect
를 사용하지 않으면 1초만 빼고 종료되니 꼭 useEffect
사용하기 const minutes = String(Math.floor((timeLeft / (1000 * 60)) % 60)).padStart(2, '0');
const second = String(Math.floor((timeLeft / 1000) % 60)).padStart(2, '0');
padStart
를 사용하였다. return (
<div>
{minutes} : {second}
</div>
);
그리고 변수로 저장한 minutes
와 seconds
를 return해주면 컴포넌트 작성은 끝이다!🤩
<div className={'pt-[1rem] w-20 mb-16 ml-3 mt-8 font-bold text-[red]'}>
{isCodeShow && <Timer />}
</div>
버튼을 누르면 타이머가 시작되어야 하기 때문에 버튼 클릭하면 isCodeShow
= true 로 변하게 state를 설정해두었다.
그래서 isCodeShow
가 true 일때만 타이머가 작동할 수 있게 위처럼 코드를 작성했다.
export const Timer = memo(() => {
const MINUTES_IN_MS = 3 * 60 * 1000;
const INTERVAL = 1000;
const [timeLeft, setTimeLeft] = useState<number>(MINUTES_IN_MS);
const minutes = String(Math.floor((timeLeft / (1000 * 60)) % 60)).padStart(2, '0');
const second = String(Math.floor((timeLeft / 1000) % 60)).padStart(2, '0');
useEffect(() => {
const timer = setInterval(() => {
setTimeLeft((prevTime) => prevTime - INTERVAL);
}, INTERVAL);
if (timeLeft <= 0) {
clearInterval(timer);
console.log('타이머가 종료되었습니다.');
}
return () => {
clearInterval(timer);
};
}, [timeLeft]);
return (
<div>
{minutes} : {second}
</div>
);
});