【发布时间】:2019-03-27 14:48:59
【问题描述】:
我正在构建一个简单的计时器应用程序。当用户点击播放时,handlePlayPause 函数被调用。我创建了一个 isRunning 布尔值来检查计时器是否已经在运行。如果不是,则计时器将启动(这第一部分有效),而如果是,则调用 pauseTimer 函数。最后一个函数将isRunning 切换回 false 并且应该清除间隔。但是,间隔不会被清除。你能看到我做错了什么吗?
感谢您的帮助!
export default function App() {
const [sessionLength, setSessionLength] = useState(25)
const [breakLength, setBreakLength] = useState(5)
const [timeLeft, setTimeLeft] = useState(25 * 60 * 1000)
const [isRunning, setIsRunning] = useState(false)
let intervalId = null
let handlePlayPause = () => {
if (!isRunning) {
setTimeLeft(sessionLength * 60 * 1000)
playTimer()
} else if (isRunning) {
pauseTimer()
}
}
let playTimer = () => {
setIsRunning(true)
intervalId = setInterval(() => {
setTimeLeft(timeLeft => timeLeft - 1000)
parseToMinuteSeconds(timeLeft)
}, 1000)
}
let pauseTimer = () => {
setIsRunning(false)
clearInterval(intervalId)
}
let resetAll = () => {
setSessionLength(25)
setBreakLength(5)
}
let parseToMinuteSeconds = timeInMilliseconds => {
return //a string with the time in this format 00:00
}
return (
<div className="App">
<Background>
<UpperMetalBand />
<UpperPart />
<LowerPart />
<LowerMetalBand />
<Wrapper>
<Title>Pomodoro</Title>
<Subtitle>TIMER</Subtitle>
<PlayButton
id="start_stop"
onClick = {handlePlayPause}
>
<i className="fa fa-play" />
</PlayButton>
<Reload
onClick={resetAll}
id="reset"
>
<i className="fas fa-sync-alt" />
</Reload>
<Session
setSessionLength={setSessionLength}
sessionLength={sessionLength}
/>
<Break
setBreakLength={setBreakLength}
breakLength={breakLength}
/>
<span id="time-label">
<Timer id="time-left">00:00</Timer>
</span>
</Wrapper>
</Background>
</div>
)
}
【问题讨论】:
-
如果您提供一个简洁的可运行示例会很好
-
尽可能向我们展示
clearInterval方法 -
@tomrlh
clearInterval是浏览器 API 的一部分,与setInterval相同。 see more details
标签: javascript reactjs react-hooks