为了账号安全,请及时绑定邮箱和手机立即绑定

反应功能组件:clearInterval()不会清除我的间隔

反应功能组件:clearInterval()不会清除我的间隔

德玛西亚99 2021-04-02 22:19:43
我正在构建一个简单的计时器应用程序。当用户单击播放时,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="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>  )}
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我认为问题在于您如何存储间隔ID。当使用功能组件并且我们想存储“实例”变量时,我们可以使用useRef钩子。


   let intervalId = useRef(null)


  let handlePlayPause = () => {

    debugger

    if (!isRunning) {

      setTimeLeft(sessionLength * 60 * 1000)

      playTimer()

    } else if (isRunning) {

      pauseTimer()

    }

  }


  let playTimer = () => {

    setIsRunning(true)

    intervalId.current = setInterval(() => {

      console.log('interval')

      setTimeLeft(timeLeft => timeLeft - 1000)

      parseToMinuteSeconds(timeLeft)

    }, 1000)

  }



  let pauseTimer = () => {

    setIsRunning(false)

    clearInterval(intervalId.current)

  }

在react docs上有一个与您的用例类似的示例


查看完整回答
反对 回复 2021-04-08
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号