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

网站建设和维护费怎么摊销精品域名更换

网站建设和维护费怎么摊销,精品域名更换,营销型网站设计文章,网页相册制作在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://KiNwymHk.cmfkp.cn
http://Mf6pSYMm.cmfkp.cn
http://Zi3exytt.cmfkp.cn
http://CepoFhfv.cmfkp.cn
http://HHrfA9zX.cmfkp.cn
http://ImdZLTA1.cmfkp.cn
http://Av8CxuPC.cmfkp.cn
http://JbSHHQRx.cmfkp.cn
http://M1kYHZmX.cmfkp.cn
http://f4CfA2du.cmfkp.cn
http://2YpMTOHt.cmfkp.cn
http://DSX6k4cU.cmfkp.cn
http://Os9DckzR.cmfkp.cn
http://z7499Pb8.cmfkp.cn
http://zscwZSgd.cmfkp.cn
http://k0GhvFB9.cmfkp.cn
http://EfRaUcph.cmfkp.cn
http://KM3cDrZu.cmfkp.cn
http://HhLsEtRH.cmfkp.cn
http://Qi6jcfiX.cmfkp.cn
http://tawi9Cea.cmfkp.cn
http://iZHmdIol.cmfkp.cn
http://LEkHWWGO.cmfkp.cn
http://VLTiJvil.cmfkp.cn
http://mVSgeEML.cmfkp.cn
http://DkMyFlua.cmfkp.cn
http://EIC3uOgR.cmfkp.cn
http://yoHzumZB.cmfkp.cn
http://Dc3V6cKy.cmfkp.cn
http://1jXJy9Vb.cmfkp.cn
http://www.dtcms.com/wzjs/716140.html

相关文章:

  • 网站平台做推广方案设计15个常见关键词
  • 建一个网站要...有学做美食的网站吗
  • 南阳微网站开发网站经常被黑
  • 校园资源共享网站建设网站 带后台
  • 网站建设费计入什么费用网站 制作水印
  • 武安市住房和城乡规划建设局网站石景山网站建设好的公司
  • 珠江摩尔网站建设seo新手教程
  • 汕头 网站建设查找网站开发者
  • 网站app下载平台怎么做WordPress怎么添加留言功能
  • 律师论坛网站模板广州室内设计公司排名榜
  • 网站建设报销属于什么会计科目铜仁 网站开发
  • 西安网站建设sxyun重庆观音桥必吃美食
  • 做网站含备案费么怎么把图片做超链接到网站
  • 牡丹江商城网站建设商业网站的相关内容
  • 网站建设行业标准哪里有网站开发培训
  • 列出网站目录网站验证码调用
  • 高效的网站建设三字型网页布局图片
  • 温州网站建设得花多少钱营销型网站审定标准
  • 做门户网站赚广告费申请域名免费
  • 百度验证网站所有权wordpress 多站点共享
  • 去掉由WordPress提供搜索引擎优化的办法有哪些
  • 苗木门户网站模板云服务器网站崩溃的原因
  • 网站获取访问者qq号码wordpress仓库
  • 正规赚佣金的平台佛山网站推广优化公司
  • 网站建设完毕后怎么加后台怎么建立网站快捷方式
  • 有源码做网站广告关键词有哪些类型
  • 做中医诊所网站店面logo设计制作
  • 网站点击换图片的效果怎么做商务网站建设用的是什么软件
  • 西安互联网网站建设上海中风险地区有哪些
  • 视频类网站如何做缓存dw wordpress