react 定时器内闭包的存在导致 数据无法及时更新

需求:React Hooks useEffect使用定时器,每3秒更新一次值

代码如下:

 const [MyV, setMyV] = useState(0);useEffect(() => {// 每隔3s,增加1const interval = setInterval(() => {setMyV(MyV+1);}, 3 * 1000);return () => {clearInterval(interval);};}, []);

实际,页面展示MyV 一直是 1。 因为setInterval会行程一个闭包。此闭包内用到的的上下文的state都是创建时的初始值。因此 setMyV(MyV+1); 时,MyV一直都是 0

优化方法1 :setMyV的函数形式

适用于此案例,只涉及一个state的变更

原理分析: setMyV((v) => v + 1); 里的v不属于闭包内部的变量,而是一个形参,因此不会一直使用0+1,而是最新的数据+1

  const interval = setInterval(() => {setMyV((v) => v + 1);}, 3 * 1000);
优化方法2 :使用ref

适用于复杂案例,或许会涉及多个state的变更、甚至更多代码、方法、state的关联调用

原理分析:useRef 返回一个具有单个 current 属性 的 ref 对象,并初始化为你提供的 初始值。
且 在后续useRef 将返回相同的对象
因此,在此setInterval的闭包里,它只会关注myRef这个ref对象指向的地址 ,不再变化即可。myRef内部的current属性千变万化,以及myRef.current内部的其他属性用到的其它state (此处指MyV)也都是最新的。

  const [MyV, setMyV] = useState(0);const myRef: any = useRef();myRef.current = () => {setMyV(MyV + 1);//只要是在这里访问、处理的,永远是最新的数据//...};useEffect(() => {// 每隔3s,增加1const interval = setInterval(() => {myRef.current();}, 3 * 1000);return () => {clearInterval(interval);};}, []);

参考:react官网对useRef的描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开启调试模式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 run()方法虽然适用于启动本地的开发服务器,但是每次修改代码后都要手动重启它。这样并不够方便,如果启用了调试支持&#xff…

AIGC-商业设计大师班,商业设计全流程(22节课)

课程内容: 02.AIGC大师计划(百天磨炼,只为让你一次成为大师).mp4 03.这5个细心的翻译工具我想全部告诉你(感受不到的工具才是好工具),mp4 04.扎实的基础是成功的关键(汇聚精华指导新功能演示方法).mp4 05.AI绘画大师级十二体咒语书写(大师级起步).mp…

SaaS企业营销:海外小众独立站Homage如何实现客群破圈?

深度垂直的市场标签对小众出海品牌来说,既是挑战也是机遇。由于品牌若想取得长远发展,无法仅凭单一狭窄的市场空间来支撑其持续壮大。因此,在追求可持续发展的道路上,小众品牌面临着需要突破既有市场圈层的挑战。 在这一过程中&am…

【Eureka】介绍与基本使用

Eureka介绍与基本使用 一个简单的Eureka服务器的设置方法:1 在pom.xml中添加Eureka服务器依赖:2 在application.properties或application.yml中添加Eureka服务器配置:3 创建启动类,使用EnableEurekaServer注解启用Eureka服务器&am…

基于Java考研助手网站设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

Calibre - 翻译电子书(Ebook Translator)

本文参考教程 :https://bookfere.com/post/1057.html 使用 Ebook Translator 插件,详见: 官网:https://translator.bookfere.comgithub :https://github.com/bookfere/Ebook-Translator-Calibre-Plugin 一、基本翻译 …

张量在人工智能中的解释?

张量在人工智能中的解释? 张量是一种多维数组,它可以看作是向量和矩阵的推广。在人工智能领域,张量被用作数据的基本表示形式,尤其在深度学习中扮演着核心角色。张量的多维性允许它们表示复杂的数据结构和关系,而其可…

Simple-STNDT使用Transformer进行Spike信号的表征学习(一)数据处理篇

文章目录 1.数据处理部分1.1 下载数据集1.2 数据集预处理1.3 划分train-val并创建Dataset对象1.4 掩码mask操作 数据、评估标准见NLB2021 https://neurallatents.github.io/ 以下代码依据 https://github.com/trungle93/STNDT 原代码使用了 RayConfig文件进行了参数搜索&…

【华为OD机试 2023】快递投放问题(C++ Java JavaScript Python)

题目 题目描述 有N个快递站点用字符串标识,某些站点之间有道路连接。 每个站点有一些包裹要运输,每个站点间的包裹不重复,路上有检查站会导致部分货物无法通行,计算哪些货物无法正常投递? 输入描述 第一行输入M N,M个包裹N个道路信息.后面M行分别输入包裹名、包裹起点、包…

期末成绩怎么快速发给家长

Hey各位老师们,今天来聊一个超级实用的话题:如何快速高效的向家长们传达学生的期末成绩。你可能会想,这不是很简单吗?直接班级群发个消息不就得了?但别忘了,保护学生隐私和自尊心也是很重要的哦&#xff01…

GB28181视频汇聚平台EasyCVR接入Ehome设备视频播放出现异常是什么原因?

多协议接入视频汇聚平台EasyCVR视频监控系统采用了开放式的架构,系统可兼容多协议接入,包括市场标准协议:国标GB/T 28181协议、GA/T 1400协议、JT808、RTMP、RTSP/Onvif协议;以及主流厂家私有协议及SDK,如:…

视频融合共享平台LntonCVS视频监控平台在农场果园等场景的使用方案

我国大江南北遍布着各类果园。传统的安全防范方式主要是建立围墙,但这种方式难以彻底阻挡不法分子的入侵和破坏。因此,需要一套先进、科学、实用且稳定的安全防范报警系统,以及时发现并处理潜在问题。 需求分析 由于果园地处偏远且缺乏有效防…

【已解决】后端接口返回的是文件流(数据流),前端代码如何实现下载文件流--封装代码

后端接口返回的是文件流(数据流),前端代码如何实现下载文件流--封装代码 实例代码环境 前端框架:vue3.0 请求插件:axios 1.6.2 export async function downFile(url, params, config) {downloadLoadingInstance ElLoa…

redis以后台的方式启动

文章目录 1、查看redis安装的目录2、Redis以后台的方式启动3、通过客户端连接redis4、连接后,测试与redis的连通性 1、查看redis安装的目录 [rootlocalhost ~]# cd /usr/local/redis/ [rootlocalhost redis]# ll 总用量 112 drwxr-xr-x. 2 root root 150 12月 6…

【从零开始认识AI】梯度下降法

目录 1. 原理介绍 2. 代码实现 1. 原理介绍 梯度下降法(Gradient Descent)是一种用于优化函数的迭代算法,广泛应用于机器学习和深度学习中,用来最小化一个目标函数。该目标函数通常代表模型误差或损失。 基本思想是从一个初始…

Docker镜像仓库:存储与分发Docker镜像的中央仓库

探索Docker镜像仓库:存储与分发Docker镜像的中央仓库 如果你是Docker的新手,或者已经在使用Docker但还不太了解Docker镜像仓库,那么这篇博客将是你的最佳指南。我们将从基础概念开始,逐步深入,帮助你全面掌握Docker注…

JS中的三种事件模型

JavaScript 中的事件模型主要有三种: 传统事件模型(DOM Level 0)标准事件模型(DOM Level 2)IE 事件模型(非标准,仅限于旧版本的 Internet Explorer) 下面分别介绍这三种事件模型&…

【JavaScript 小工具】——获取 URL 中的参数

要从 location.href 中获取指定参数,你可以使用 JavaScript 来解析 URL 并提取参数值。以下是一种常见的方法: // 获取当前页面的 URL var urlString window.location.href;// 解析 URL,获取参数部分 var url new URL(urlString);// 获取参…

C#写一个WebService服务器

首先在NuGet中下载Fleck动态库 创建一个WebSocketHelper类 public class WebSocketHelper {//客户端url以及其对应的Socket对象字典IDictionary<string, IWebSocketConnection> dic_Sockets new Dictionary<string, IWebSocketConnection>();//创建一个 websock…