首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在react中停止递归setTimeout函数(clearTimeout不工作)?

在React中停止递归setTimeout函数可以使用 useRef 钩子和 clearTimeout 方法。下面是一个示例代码:

代码语言:txt
复制
import React, { useRef, useEffect } from 'react';

function RecursiveComponent() {
  const timeoutRef = useRef(null);

  useEffect(() => {
    // 定义递归函数
    const recursiveFunc = () => {
      // 执行一些操作...

      // 继续递归调用setTimeout
      timeoutRef.current = setTimeout(recursiveFunc, 1000);
    };

    // 开始递归调用setTimeout
    timeoutRef.current = setTimeout(recursiveFunc, 1000);

    // 组件卸载时清除定时器
    return () => {
      clearTimeout(timeoutRef.current);
    };
  }, []);

  // 其他组件渲染逻辑...

  return (
    <div>
      {/* 组件内容 */}
    </div>
  );
}

export default RecursiveComponent;

在上面的示例代码中,我们使用 useRef 钩子创建了一个名为 timeoutRef 的引用对象来存储 setTimeout 返回的计时器 ID。然后在 useEffect 钩子中,我们定义了一个递归函数 recursiveFunc,并使用 setTimeout 来调用该递归函数。

在组件卸载时,我们通过返回一个清除定时器的函数来清除计时器。这样做可以确保在组件卸载时停止递归调用 setTimeout,避免内存泄漏或不必要的计算。

需要注意的是,在 useEffect 的第二个参数中传入一个空数组 [],这样可以确保 useEffect 只在组件首次渲染时执行一次递归调用 setTimeout。如果不传入第二个参数或传入一个非空数组,那么 useEffect 将会在每次组件重新渲染时执行,导致递归调用 setTimeout 多次。

希望这个答案能满足你的需求。如果你有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

React】406- React Hooks异步操作二三事

作者:小蘑菇小哥 React Hooks 是 React 16.8 的新功能,可以在编写 class 的情况下使用状态等功能,从而使得函数式组件从无状态的变化为有状态的。...当需要在其他地方(例如点击处理函数)设定计时器,在 useEffect 返回值清理时,使用局部变量或者 useRef 来记录这个 timer。不要使用 useState。...这个接口的兼容性不错,除了 IE 之外全都兼容( Chrome, Edge, FF 和绝大部分移动浏览器,包括 Safari)。...这里和上面一节(组件加载时)最大的差异在于 React Hooks 只能在组件级别编写,不能在方法( dealClick)或者控制逻辑( if, for 等)内部编写,所以不能在点击的响应函数再去调用...但我们依然要利用 useEffect 的返回函数来做清理工作。 以计时器为例,假设我们想做一个组件,点击按钮后开启一个计时器(5s),计时器结束后修改状态。

5.6K20

jssetTimeoutclearTimeout的使用

一、概念 1、js可以通过setTimeout函数设置定时器,让指定的代码在指定的时间运动. 如果我们希望在setTimeout之行前终止其运行就可以使用clearTimeout()。...2、clearTimeout()用于重置js定时器,如果你希望阻止setTimeout的运行,就可以使用clearTimeout方法。...二、使用场景 1、写计时器 2、需要让程序隔一段时间处理什么事情,3秒后自动关闭弹出框等 3、事件延迟,满足业务需求,鼠标从主菜单moveout的时候,判断鼠标是否moveover副菜单,再隐藏副菜单...点击“停止计时”可停止计时。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

2.5K30
  • React 的调度系统 Scheduler

    React 版本为 18.2.0 React 使用了全新的 Fiber 架构,将原本需要一次性递归找出所有的改变,并一次性更新真实 DOM 的流程,改成通过时间分片,先分成一个个小的异步任务在空闲时间找出改变...Scheduler 做这个调度工作的在 React 叫做 Scheduler(调度器)模块。...setTimeout : null; const localClearTimeout = typeof clearTimeout === 'function' ?...优先级队列的底层实现是小顶堆,实现原理展开讲。我们只需要记住优先级队列的特性:就是出队的时候,会取优先级最高的任务。在 scheduler ,sortIndex 最小的任务的优先级最高。...Scheduler 向外暴露 scheduleCallback 方法,该方法接受一个优先级和一个函数(就是任务),对于 React 来说,它通常是 workLoopSync 或 workLoopConcurrent

    90310

    详解 JS 的事件循环、宏微任务、Primise对象、定时器函数,以及其在工作的应用和注意事项

    Promise 在工作的应用场景 Promise 在处理网络请求、文件操作等异步操作时非常有用,它使得代码更加清晰,减少了回调地狱(callback hell)的问题。...,并在打印5次后停止 clearTimeout() 和 clearInterval() 这两个函数用于取消由 setTimeout() 和 setInterval() 设置的定时器。...语法 clearTimeout(timeoutID):取消由 setTimeout() 设置的定时器。...如果使用函数组件和Hooks,可以在useEffect钩子处理定时器: import React, { useEffect } from 'react'; function MyComponent(...process.nextTick 在工作应用的注意事项 递归调用:如果 process.nextTick 被递归调用,或在一个循环中大量调用,它可以导致I/O饿死,因为它会在处理任何I/O事件之前不断地将新的回调加入到队列

    25610

    前端-用 Vue 编写一个长按指令

    本文就是讲解如何在按下(或者按住)一个按钮时,既执行一个函数,又清除输入。 首先,我会讲解如何使用纯 JS 实现。而后也会创建一个 Vue 指令。 请系好安全带。好戏在后头呢。...启动函数 这个函数包括一个 setTimeout,它是 JavaScript 的一个基本方法,允许在特定时间之后执行一个函数。 注意,click 事件执行的过程,会触发另外两个事件。...// 创建计时器 ( 1s之后执行函数 ) let start = (e) => { // 如果是点击事件,启动计时器 if (e.type === 'click' && e.button...}, 1000) } } 取消函数 这个函数见名知意,用来取消启动函数创建的 setTimeout。...要取消 setTimeout ,可以使用 JavaScript clearTimeout 方法,它主要用来清除 setTimeout() 方法设置的计时器。

    2.3K40

    超详细由浅到深实现防抖和节流(内附笔记)

    可以看到执行上面的demo,我们输入值以后触发keyup事件就会隔1秒钟蓝色div才会出现字,如果你一直触发是不会显示的等到你停止触发后的一秒后才显示 有同学可能对第一版代码觉得挺简单的,确实简单,不过我还是要啰嗦几句...,第一版的代码,「debounce函数」返回了一个匿名函数,而这匿名函数又引用了timeout这个变量,这样就形成了闭包,也就是函数的「执行上下文」的「活动对象」并不会被销毁,保存了timeout变量...这里涉及的知识点就是「this指向」和「arguments、apply」等,先来说说arguments属性,我们知道可以通过arguments属性获取函数的参数值,而dom事件操作,会给「回调函数(这里回调函数是...getSearchInfo的指向,这样我们用apply就完美实现了 立即执行 这时候我们开发的问题解决了,但是万恶的产品又提出了一个新的需求方案:「我希望非要等到事件停止触发后才执行,我希望立刻执行函数...防抖函数的总结 ❝上面罗里吧嗦的说了一堆,实际上可以精简成两个需求 ❞ 非立即执行:,如果你在一个事件触发的n秒内又触发了这个事件,那我就以新的事件的时间为准,n 秒后才执行 立即执行:我希望非要等到事件停止触发后才执行

    64420

    js动画requestAnimationFrame详解「建议收藏」

    看这篇文章之前我希望你会用setTimeout做简单的动画,也就是利用递归来代替setInterval做动画。...他的用法与setTimeout差不多。 与setTimeout一样的是都会返回一个唯一标识,setTimeout可以通过clearTImeout()关闭定时器。...通常来你传入的回调函数每秒会执行60次,但是如果你的设备的游览器遵循W3c的标准,那么回到函数每秒执行的次数会与你设备的刷新率相匹配。...不仅如此这还是一个高性能的方法,在大多游览器中一旦页面处于浏览器的当前标签,就会自动停止动画。...为了让动画显示流畅,我们需要将定时器setTimeout的间隔时间定位 **“1000/60” ** 也就1秒执行60次回调函数,大约每隔16.67毫秒会执行一次,这样就能匹配显示屏的帧率。

    4.6K21

    节流防抖的使用_监听滚动节流

    :游戏中的回城机制,中途打断后必须要重新回城,重新读条。 应用场景 用户在输入框连续输入一串字符时,可以通过防抖策略,只有在输入完后,才执行查询的请求,这样可以有效减少次数,节约请求资源。...从资源上来说是很浪费的行为,实际应用,用户是输出完整的字符后才会请求。...如果停止输入但是在指定间隔内又输入,会重新触发计时。...防抖代码 let timer; // 维护同一个timer function debounce(fn, delay) { clearTimeout(timer); timer = setTimeout...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    86820

    jssettimeout和setInterval区别_JavaScript set

    注:调用过程,可以使用clearTimeout(id_of_settimeout)终止 参数 描述 code 必需,要调用的函数后要执行的 JavaScript 代码串。...当单击开始按钮时开始计时,最小单位为0.01秒,此时再次单击按钮则停止计时,文本框显示经过的时间。另外一个按钮用于将当前时间清零。...在window.setTimeout函数,使用_hello(userName)来返回一个不带参数的函数句柄,从而实现了参数传递的功能。...,就需要在执行的程序再定时调用自己才行。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.8K10
    领券