关于setInterval遇到的一个有趣的坑

在学习React Hooks时,作者遇到一个计时器组件的问题:点击开始后,再次点击开始并暂停,计时器无法正确停止,且连续点击开始会使时间增长加快。分析发现,每次开始时未清除旧的定时器,导致多个定时器同时控制时间。解决方案是每次开始时清除定时器。此外,由于事件循环机制,每次start后的首次计时会大于设定的1000ms。了解事件循环的工作原理有助于避免此类问题。
摘要由CSDN通过智能技术生成

问题复现

今天学习hooks的时候,做到一个demo,做一个计时器组件,这个组件有开始和暂停两个功能
这确实是一个很简单的功能,只需要使用window.setInterval来提供计时功能,用useRef来保存计时器的引用,这样可以随时暂停,最开始我的设计如下:

import React, {
    useState, useCallback, useRef } from "react";

export const Timer = () => {
   
	//计时器状态及引用
  const [time,setTime] = useState(0);
  const timer = useRef(null);//timer用以跨组件渲染之间保存变量

	//开始计时
  const handleStart = () => {
   
    timer.current = window.setInterval(() => {
   
      setTime(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值