当前位置: 首页 > news >正文

网站建设翻译英文是什么石家庄市里的网站公司

网站建设翻译英文是什么,石家庄市里的网站公司,广州微信网站建设平台,旅游订票网站开发在react中hook的闭包问题很容易在不经意间犯错,项目写大了之后更是难以找到到底是哪里出了问题。 为什么会出现闭包问题 出现闭包问题的原因就是函数中操作的变量不是最新的变量,什么意思呢,我们知道函数组件每次刷新都是重新运行一次函数&…

在react中hook的闭包问题很容易在不经意间犯错,项目写大了之后更是难以找到到底是哪里出了问题。

为什么会出现闭包问题

出现闭包问题的原因就是函数中操作的变量不是最新的变量,什么意思呢,我们知道函数组件每次刷新都是重新运行一次函数,这就会导致,每次刷新都会产生新的变量,但是如果用useEffect把依赖性置为空数组的话,那么useEffect中的回调就不会再次执行,导致回调中保存的仍是刷新前的变量。

代码
import { useEffect } from "react";
import { useState } from "react";function App() {const [count, setCount] = useState(0);useEffect(() => {const interval = setInterval(() => {setCount(count + 1);}, 500);return () => {clearInterval(interval)};}, []);return (<div>{count}  </div>);
}export default App;

运行效果如下

请添加图片描述

我们可以看到代码并没有我们预期的结果,加到1就停止增加了,为什么呢?
我们分析一下APP函数的运行次数。
第一次运行count = 0过一秒钟后因为会setCount导致count = 1然后刷新页面,重新运行APP函数,在内存中生成新的count变量,useEffect因为依赖项为[]所以不在再次执行,setInterval中的函数保存的还是第一次函数执行的count变量,setInterval后续的每次执行操作的都是第一次的变量导致一直setCount(0 + 1),App函数并不会再次刷新了。
看图

在这里插入图片描述

现在知道了闭包的产生原因,就是因为函数中操作的变量不是最新的,那解决办法就很明显了。

  • 函数前后刷新都会产生新的变量,那我们让他不产生新的不就可以了,这就可以使用useRef这个钩子了。
import { useEffect, useRef } from "react";
import { useState } from "react";function App() {const countRef = useRef(0);const [_, forceUpdate] = useState(0);useEffect(() => {const interval = setInterval(() => {console.log('count', countRef.current)countRef.current += 1;forceUpdate(Math.random())}, 500);return () => {clearInterval(interval)};}, []);return (<div>{countRef.current}  </div>);
}export default App;

在这里插入图片描述
操作方式

在这里插入图片描述

  • 每次组件刷新的时候都让函数重新执行,让函数去操作最新变量就可以了
import { useEffect } from "react";
import { useState } from "react";function App() {const [count, setCount] = useState(0);useEffect(() => {const interval = setInterval(() => {setCount(count + 1);}, 500);return () => {clearInterval(interval)};}, [count]);return (<div>{count}  </div>);
}export default App;

操作方式

  • 闭包导致了这个问题,那我们就不让他产生闭包,这就用到了setCount的另一个重载的形式。
import { useEffect } from "react";
import { useState } from "react";function App() {const [count, setCount] = useState(0);useEffect(() => {const interval = setInterval(() => {// 使用箭头函数,可以获取到最新的count值setCount(count => count + 1);}, 500);return () => {clearInterval(interval)};}, []);return (<div>{count}  </div>);
}export default App;

我们把函数传入setCount中,在setCount执行的时候会自动把最新的count值传入,就不会出现闭包导致每次操作的count都是0的情况了。

创造不易,喜欢留下个👍 吧

http://www.dtcms.com/a/526878.html

相关文章:

  • 怎样利用网站做推广广州达美网站建设公司
  • 网站维护要多久时间普象工业设计网站
  • 贵阳做网站开发的公司百度seo公司兴田德润
  • 网站中图片怎么做的建材团购网站建设方案
  • 网站服务器ip查询公司logo设计logo
  • 网站做支付按流量付费吗Wordpress插件开发中文字幕
  • 云恒网站建设公司下沙做网站
  • 免费的网站推广 外贸外链互换平台
  • 咸宁哪个企业没有做网站做品管圈网站
  • 做网站设计多少钱成都做网站的
  • 松江做网站需要多少钱织梦的cms哪些网站
  • 二级域名绑定网站免费的个人简历模板 简约
  • 公众号自己做电影网站山东省新闻
  • 网站多久需要维护法国新增确诊病例
  • 网站建设和风险评估qq群推广链接
  • 东莞高端做网站公司百度排行榜风云榜
  • 做网站的接私活犯法吗河南省建设教育培训中心网站
  • 网站建设网站建设哪家好网络平台投诉电话
  • 公司弄个网站多少钱如何进行营销型企业网站的优化
  • 做网站的公司那家好。网站访客抓取系统
  • 一般网站开发用什么语言传媒网站建设价格
  • 建立一个平台网站需要多少钱红桥网站建设公司
  • 南宁致峰网站建设微站是什么
  • 建设广州公司网站wordpress 打开慢 google
  • 东营市东营网站设计网站改版提升总结
  • 商务网站构建与维护网站开发从零到
  • 迁安网站建设seo推广代理
  • 17网站一起做网店广州新塘php网站制作 青岛
  • 环境设计排版哪个网站好做网站都需要自己的服务器吗
  • 太原网站设计排名网站推广的基本方法为()