在使用定时器时,关闭后重新开启,定时器显示有问题怎么解决

news/2024/7/15 17:27:28 标签: react.js, javascript, 前端

问题:在使用定时器时,关闭后重新开启,定时器显示会很快速的显示

解决:在开启当前定时定时器时,关闭上一个定时器

javascript">import { useState } from "react";

const TimerPage = () => {
  const [changeNum, setChangeNum] = useState<any>(null);
  const [getChangeNum, setGetChangeNum] = useState<any>(null);
  const [activate, setActivate] = useState(false);

  const initiate = () => {
    let num = 11;
    setGetChangeNum(0);
    clearInterval(changeNum);

    const id = setInterval(() => {
      // 定时执行的代码
      num--;
      if (num === 0) {
        num = 10;
      }
      setGetChangeNum(num);
    }, 1000); // 每隔1秒执行一次

    setChangeNum(id);
    setActivate(!activate);
  };

  return (
    <div className="box">
      <button onClick={initiate}>显示数字</button>
      <hr></hr>
      {activate ? <p>{getChangeNum} 秒后刷新数据 </p> : ""}
    </div>
  );
};

export default TimerPage;

这段代码是一个React函数式组件TimerPage,它包含了一个用于显示递减数字并刷新数据的功能。

首先,通过import { useState } from "react"语句从React库中导入useState钩子函数,用于在函数式组件中声明和管理状态。useState函数返回一个包含状态值和更新状态值的数组。

在组件中,使用useState函数声明了三个状态变量:changeNum、getChangeNum和activate。changeNum用于存储定时器的ID,getChangeNum用于存储递减的数字,activate用于存储刷新数据的状态。初始值都设置为null,false。

接下来,定义了一个名为initiate的函数。在这个函数中,首先声明一个变量num并初始化为11,表示需要递减的初始数字。

然后,使用 clearTimeout 函数清除之前的定时器,以免出现多个重复的定时器。

接下来,使用setInterval函数创建了一个定时器。setInterval函数接受两个参数:回调函数和时间间隔。在这里,回调函数为一个箭头函数,用于执行定时的递减操作。

在回调函数中,num递减1,表示递减的数字。当num等于0时,通过条件判断将num重置为10,实现循环递减的效果。

在回调函数中,使用setGetChangeNum函数将递减的结果num更新到getChangeNum状态变量中,以便将其显示在文本段落元素中。

setInterval的第二个参数为时间间隔,这里设置为1000毫秒,即每隔1秒执行一次回调函数。

最后,使用setChangeNum函数将定时器的ID存储到changeNum状态变量中,以便在需要的时候清除定时器。使用setActivate函数切换activate状态变量的值,用来触发刷新数据的操作。

在组件的返回部分,包含一个div元素、一个button元素和一个文本段落元素。点击button元素时,触发initiate函数,启动定时器,递减数字并显示在文本段落元素中。同时,根据activate状态变量的值决定是否显示文本段落元素。

需要注意的是,在每次点击按钮时,旧的定时器会被清除,然后重新创建一个新的定时器。这样可以避免多个重复的定时器同时存在。


http://www.niftyadmin.cn/n/4974752.html

相关文章

VUE笔记(一)初识vue

一、vue的简介 1、什么是vue 官网地址:Vue.js Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。 构建用户界面&#xff1a;之前在学习vue之前通过原生js对DOM操作进行构建用户界面的 使用原生js构建用户界面的不足 - 没有规范&#xff0c…

ftp免交互自动上传文件脚本

缘由 工作中经常用ftp上传文件&#xff0c;共享给他人&#xff0c;在免交互模式下&#xff0c;可以使用shell脚本&#xff0c;固化用户名、密码等固定输入的重复信息 shell脚本例子 #!/bin/bash # 根据入参指定目录或当前目录下&#xff0c;根据固定目录结构和固定目标文件信…

数据结构(Java实现)-包装类和泛型

包装类 在Java中&#xff0c;由于基本类型不是继承自Object&#xff0c;为了在泛型代码中可以支持基本类型&#xff0c;Java给每个基本类型都对应了 一个包装类型。 基本数据类型和对应的包装类 装箱和拆箱 装箱操作&#xff0c;新建一个 Integer 类型对象&#xff0c;将 i 的…

解决Spring Boot项目中pom.xml环境配置 打包后生效 但idea版本运行无效的问题

上文 Spring Boot中通过maven进行多环境配置 中我们通过pom.xml配置了环境选择 但这个只有在打包出来的jar中生效 我们直接通过 idea启动 这个东西确实是有点问题 其实 我们执行一下 compile 手工编译一下 然后重新启动 很明显 我们这里配置就已经生效了 这个就是 我们每次…

数仓--------简单了解

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

9.2 【C语言】使用结构体数组

一个结构体变量中可以存放一组有关联的数据&#xff08;如一个学生的学号、姓名、成绩等数据&#xff09;&#xff0c;如果有10个学生需要参加运算&#xff0c;显然应该用数组&#xff0c;这就是结构体数组。 9.2.1 定义结构体数组 例9.3 有三个候选人&#xff0c;每个选民只…

c++中的const与constexpt的区别

c中的const与constexpr的区别 const const 是一种修饰符&#xff0c;用于声明一个只读的常量。它可以用于变量、函数参数和函数返回类型。声明为 const 的变量的值在初始化后就不能再改变。 适用场景&#xff1a; const 适用于声明运行时常量&#xff0c;在编译时无法确定值…

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

以下动作有什么错? std::string* stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序。使用了new&#xff0c;也搭配了对应的 delete。但还是有某样东西完全错误:你的程序行为不明确&#xff08;未有定义&#xff09;。最低限度&#xff…