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

setInterval 和 hooks 撞在一起,翻车了~

接下来我们手动实现一个计时器例子来说明下,hooks 里使用 setIntervalclearInterval 失效的根本原因。...实际上上面的代码是有问题的,React 默认会在每次渲染,都重新执行 useEffect。而调用了 clearInterval 后重新 setInterval 的时候,计时会被重置。...计时器还是失败了,无法实现轮询功能。 为何现象与预期不符呢?其实仔细观察,你会发现,这是个闭包的坑! useEffect 使用的 count 是在第一次渲染的时候获取的。 获取的时候,它就是 0。...另一方面,由于设置了 savedCallback ref,我们可以获取到最后一次渲染设置的回调,然后在计时器触发时调用。这下数据都有记忆了,问题被解决了,不过这也太麻烦了,可读性很差!...(tick, 1000); return () => clearInterval(id); }, []); } 这里延时值是写死的,我们需要参数化,考虑到,如果 delay 变更了,我们也是要重新启动计时器

1.3K20

通过 React Hooks 声明式地使用 setInterval

可是为什么在 Hooks 里使用 setIntervalclearInterval 这么让人恼火? 回到刚开始的计时器例子,我们尝试手动去实现它。...相对应的,setInterval 却没有描述到整个过程 - 一旦你设置了计时器,它就无法改变了,只能清除它。 这就是 React 模型和 setInterval API 之间的“阻抗不匹配”。...state 我们无法用 callback2 替换掉 callback1 但是又不重设计时器 如果我们压根不替换计时器,而是传入一个 savedCallback 变量,始终指向最新的计时器回调呢??...另一方面,由于设置了 savedCallback ref,我们可以获取到最后一次渲染设置的回调,然后在计时器触发时调用。...如果 delay 变更了,我们是想要重新启动计时器的。

7.4K220
您找到你想要的搜索结果了吗?
是的
没有找到

解释 JavaScript计时器的工作原理

JavaScript 中,计时器是一个非常值得注意的功能。与普通的手表计时器一样,我们可以一次启动计时器,并在特定时间后执行 JavaScript 中的函数或代码。...站长源码网 简单来说,我们可以使用计时器在一段时间延迟后执行代码。例如,当您访问某个网站,它会在您访问 3 到 4 分钟后显示注册框,我们可以使用 JavaScript 实现。...因此,在 JavaScript 中有两个不同的函数来设置计时器,我们将在本教程中探讨。...返回值 setTimeOut() 函数返回唯一 id,我们可以用它来杀死计时器。 例 在下面的示例中,当用户单击“开始计时器”按钮,它将调用 callTimer() 函数。...用户可以观察到,当他们按下启动计时器按钮,startInterval() 函数将执行并调用 setInterval() 函数。setInterval() 函数在每秒调用回调函数后。

1.5K20

JS设置定时器_js设置定时器

我们能用一个变量接收这个id,但是如果重复执行一条接收创建语句,那么你只能接收到最新创建的定时器的id,之前创建的定时器的id会被覆盖,但是定时器数量在增加,这就会导致界面一些功能错乱,解决方法就是在重复按开始按钮,...但是有一个小细节,就是当你在一次页面运行的过程中,打个比方,你创建了第五个定时器,它的id为5,然后你把它销毁,再创建一个定时器,那么这个定时器的编号会是6,而不是5,5号id是不会因为第五个定时器器的销毁而可以被再次使用...案例分析 用两个按钮来控制灯泡的闪烁,运用CSS简单美化页面,然后控制功能由JavaScript实现,但在使用JS中的计时器遇到一些问题。也不再废话了, 下面是最开始的代码 <!...,但是只有最新的计时器会被赋值给b,然后就导致STOP按钮只能中断最新的定时器,之前的定时器我就找不到了,但它们还在运作,就会导致点击开始次数越多,灯泡闪烁间隔越小,STOP也无法阻止,这里首先我想到的改进方法就是...*/ b =setInterval(off_open,100); } but_stop.onclick = function (){ clearInterval(b) } </

29.9K30

关于JavaScript计时器的知识学习

虽然“JavaScript计时器” 很出名,但是 setTimeout 和 setInterval 函数并不是 ECMAScript 规范或者任何 JavaScript 引擎实现。...当此循环正在滴答,节点无法执行任何操作。 这当然在实际是很糟糕的,但它会帮助你理解 setTimeout 延迟不是一个保证的东西,而是一个最小的事情。500 ms 表示最小延迟为 500 ms。...当您在常规函数中使用 JavaScript this 关键字,如下所示: function whoCalledMe() { console.log("Caller is", this);...答案是:根据执行计时器功能的位置而有所不同。在这个例子中,你无法直接判断谁是调用者。因为定时器实现是将你的函数唤醒。...请注意,这只在您在常规函数中使用 JavaScript 的 this 关键字才有意义。如果您使用箭头功能,则根本不需要担心调用者。

1.6K40

一个setInterval的小问题

一个setInterval的小问题 HTML5学堂:在制作页面动画效果中,很多情况都会用到定时器,setInterval则是计时器的一种,可按照指定的周期,不停的调用函数,直到clearInterval...在setInterval使用的时候,有些小细节,我们也是需要注意的。 今天在答疑发现了一个setInterval的小问题,在这里总结一下。 首先咱们先来看个小例子: 写法一 <!...alert(1)          }      这是一个最简单的计时器小例子,也是setInterval最标准的写法。...原因很简单,setInterval要求第一个参数必须是含Javascript命令的字符串或函数对象,所以setInterval("move()",1000)以及setInterval(move,1000...当Javascript运行到这个语句,会立即执行move这个函数,然后把函数的返回值作为setInterval的第一个参数,而由于move函数没有返回值,实际就相当于setInterval(null,

76290

【JS实用技巧篇】02-无缝轮播图中的计时器

CSDN话题挑战赛第2期 参赛话题:学习笔记 JavaScript专栏:js实用技巧篇 该专栏博主会持续更新,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步✨✨✨ 欢迎大家在评论区留言交流技术以及学习方法...其实现方式这里就不展示了,回到我们的主题——计时器,细心的小伙伴可能已经发现当鼠标移动到图片内,将会停止自动切换,而鼠标离开则会继续切换。这就是我们今天所要讲解的计时器。...计时器 计时器实现: let timerId;//声明一个计时器ID function start() { let duration = 1000; if (timerId) return;...timerId = setInterval(() => {}, duration); } function stop() { clearInterval(timerId); timerId...另外,还需注意timerId值的清除,即timerId=null;不可省略,否则下次调用start(),即使计时器已经关闭,但timerId仍有值,就无法开启一个新的计时器setInterval()中传的函数就无法执行

1.9K20

Web前端学习 第3章 JavaScript基础教程17 计时器

一、计时器方法概述 计时器方法可以实现在指定的时间过后,单次或重复调用函数的功能,setTimeout可以实现函数在指定毫秒数后单次执行,setInterval可以实现函数在指定毫秒数后重复执行,语法如下所示...三、setInterval setInterval的用法与setTimeout的用法非常类似,都是传入两个参数,第一个参数是计时器执行的函数,第二个参数是毫秒数。...) 从代码可以看出,setInterval与setTimeout完全相同,区别在于setInterval参数中的函数没个指定毫秒数后都会重复执行,当我们不希望计时器重复执行的时候,就可以使用clearInterval...方法来停止计时器 1 var btn = document.querySelector("button"); 2 var t = setInterval(function(){ 3 console.log...(showNumber,1000); 7 showNumber(); //调用函数,可以在页面加载直接输出1。

1.5K20

React的Effect Hook解决函数组件的性能问题和潜在bug!

useEffect 中要谨慎使用 useState,因为它会触发组件渲染后,再次调用 useEffect,形成一个死循环。...只有当数组里面的值改变,useEffect 才会被调用。 // 只有当 `props.source` 改变后才会调用 useEffect。...; }; }, [props.source], ); 三、清除机制 useEffect 被调用时,执行了一些操作(譬如设定了一个定时器、访问了一些网络资源),在组件卸载,...; } 2、不完美解决方案 在 useEffect 中添加 count 依赖,这样每一次 useEffect 执行 setCount 带来count的变化,都会使得 useEffect 再次被调用...,可以解决问题,但是这样会带来另一个问题,每一次执行 useEffect 都会清除计时器,再重新设置计时器,这不是我们想要的。

1.4K20

React的Effect Hook解决函数组件的性能问题和潜在bug!

useEffect 中要谨慎使用 useState,因为它会触发组件渲染后,再次调用 useEffect,形成一个死循环。...只有当数组里面的值改变,useEffect 才会被调用。 // 只有当 `props.source` 改变后才会调用 useEffect。...; }; }, [props.source], ); 三、清除机制 useEffect 被调用时,执行了一些操作(譬如设定了一个定时器、访问了一些网络资源),在组件卸载,...; } 2、不完美解决方案 在 useEffect 中添加 count 依赖,这样每一次 useEffect 执行 setCount 带来count的变化,都会使得 useEffect 再次被调用...,可以解决问题,但是这样会带来另一个问题,每一次执行 useEffect 都会清除计时器,再重新设置计时器,这不是我们想要的。

1.7K30

实战|仅用18行JavaScript构建一个倒数计时器

在页面上显示时钟,并在时钟为零停止时钟。 2.设置有效的结束日期 首先,你需要设置一个有效的结束日期。这应该是 JavaScript 的 Date.parse() 方法可以理解的任何格式的字符串。...在 setInterval 外调用一次 updateClock 函数,然后在 setInterval再次调用。...在你的 JavaScript 中,替换这个 const timeinterval = setInterval(() => { ... },1000); 新代码 function updateClock(...如果我们想在整个网站上设置 10 分钟的计时器,则我们不希望在用户转到其他页面重置该计时器。 一个解决方案是将时钟的结束时间保存在一个 cookie 中。...10.总结 在完成本文中的示例之后,你现在知道了如何使用几行简单的 JavaScript 代码创建自己的倒计时计时器!我们已经了解了如何制作一个基本的倒计时时钟并有效地显示它。

4.1K41
领券