FE/React
React 스톱워치 구현하기(TS)
SH_Roh
2022. 11. 17. 16:47
반응형
스톱워치를 구현해야하는 과제가 있어서 직접 구현해보았다.
StopWatch.tsx
import { useState, useEffect } from 'react'
const StopWatch = () => {
const [time, setTime] = useState(0)
const [isRunning, setIsRunning] = useState(false)
useEffect(() => {
let interval: NodeJS.Timer | undefined
if (isRunning) {
interval = setInterval(() => {
setTime((prevTime) => prevTime + 10)
}, 10)
} else {
clearInterval(interval)
}
return () => clearInterval(interval)
}, [isRunning])
return (
<div>
<time>
{`0${Math.floor((time / 60000) % 60)}`.slice(-2)} : {`0${Math.floor((time / 1000) % 60)}`.slice(-2)}
</time>
<div>
<button type='button' onClick={() => setIsRunning(true)}>
Start
</button>
<button type='button' onClick={() => setIsRunning(false)}>
Stop
</button>
<button type='button' onClick={() => setTime(0)}>
Reset
</button>
</div>
</div>
)
}
export default StopWatch
먼저 시간을 관리하는 time과 동작 여부를 나타내는 isRunning이라는 state를 만들어준 후, useEffect를 사용해 현재 스톱워치가 동작 중인 경우 time에 +10을 해준다.
현재 동작 중이지 않다면 clearInterval을 해주면 된다. 이 때 interval의 타입은 node환경의 경우 Node.Timer이고 window일 경우 number라고 한다. (이 글 참고)
time에서 각 단위에 맞게 시간을 계산해준 값을 리턴해주고, start, stop, reset 버튼에 각각 그에 맞는 동작을 onClick에 지정해주면 된다.
References
https://w3collective.com/react-stopwatch/
https://stackoverflow.com/questions/51376589/typescript-what-type-is-f-e-setinterval
반응형