🐣 ストップウォッチの検証[React]
作成日: 2022/01/16
2

うまく動かなかったコード

これだと、停止ボタンを押してもタイマーが止まってくれない。

const TimerCard = () => {
  const [time, setTime] = useState(0)
  let timerId: NodeJS.Timer

  const stopTimer = () => {
    console.log('stop: ' + timerId)
    if (!timerId) {
      return
    }
    clearInterval(timerId)
  }

  const startTimer = () => {
    timerId = setInterval(() => {
      console.log('start: ' + timerId)
      setTime(oldVal => oldVal + 1)
    }, 1000)
  }

  return (
    <STimerCard>
      <p>{time}</p>
      <SCircleButton onClick={startTimer}>▶︎</SCircleButton>
      <SCircleButton onClick={stopTimer}>■</SCircleButton>
    </STimerCard>
  )
}

スクリーンショット 2022-01-16 23.51.39.png
↑スタートした時のtimerIDが7、ストップを押した時のtimerIDがundefinedで異なるからクリアされないみたい。

useCallbackを使った

const TimerCard = () => {
  const [time, setTime] = useState(0)
  let timerId: NodeJS.Timer

  const stopTimer = useCallback(() => {
    console.log(timerId)
    if (!timerId) {
      return
    }
    clearInterval(timerId)
  }, [])

  const startTimer = useCallback(() => {
    console.log(timerId)
    timerId = setInterval(() => {
      setTime(oldVal => oldVal + 1)
    }, 1000)
  }, [])

  return (
    <STimerCard>
      <p>{time}</p>
      <SCircleButton onClick={startTimer}>▶︎</SCircleButton>
      <SCircleButton onClick={stopTimer}>■</SCircleButton>
    </STimerCard>
  )
}

スクリーンショット 2022-01-16 23.59.10.png
↑ちゃんと同じIDのタイマーを操作してくれた。

眠いので続きはまた次回。。


制作会社でフロントのコーディングやWordpressのテーマ開発をしてます。 本命はJavascriptです😋 目指せフロントエンドエンジニア👊