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

济宁网站建设济宁凡科建站网站

济宁网站建设济宁,凡科建站网站,策划公司排名,代做设计的网站这是主包在面试中遇到的一道题目,面试官的问题是:"这个页面初次展示出来时Count和step的值是什么,我点击按钮count和step的值有什么变化?“ 这个题目主包回答的不好,所以想做一个总结。 题目 import React, { …

这是主包在面试中遇到的一道题目,面试官的问题是:"这个页面初次展示出来时Count和step的值是什么,我点击按钮count和step的值有什么变化?

这个题目主包回答的不好,所以想做一个总结。

题目

import React, { useState, useEffect } from 'react';function useInterval(callback, delay) {useEffect(() => {const id = setInterval(() => {console.log('[Timer Tick]的 count:', callback._countSnapshot);callback();}, delay);return () => clearInterval(id);}, [delay]);
}export default function BuggyCounter() {const [count, setCount] = useState(0);const [step, setStep] = useState(1);function tick() {setCount(count + step);}// 注册定时器useInterval(tick, 1000);return (<div><h1>Count: {count}</h1><div><button onClick={() => setStep((s) => s + 1)}>Increase Step</button><span> 当前 step: {step} </span></div></div>);
}

分析 

首先,先好好阅读代码,主包现在发现主包在面试中有一个致命的问题就是,很多问题还没明白面试官的意思,或者像代码,还没明白代码的意思就已经开始胡说了。往往是越说越远,其实结束面试之后主包再次阅读这段答的稀烂的代码的时候,发现很能看懂。所以不要着急,先明白面试官 的意思在作答。

好的,我们来解析代码,这个函数什么作用呢。首先我们要明白这是自定义了一个Hook。传入两个参数:callback是一个函数,delay动态参数用于设置定时器的。useEffect的部分就是以delay作为依赖,并在return这个处理副作用的部分进行一个清空计时器。它实现的功能是:安全的实行定时器,在组件卸载或 delay 变化时,自动清除之前的定时器。

接下来看tick函数,就是去改变count的状态为count+step;

调用定时器,每1000ms执行一次。
 

好的,现在解析完毕,开始作答。在刚进入页面的时候,我们应该看的到一瞬间的count:0,step:1;但是1000ms后count变为1了。之后如果我们不点击按钮就会保持这样一直不变。

问题

当我们点击按钮之后,只有step的值会增加,而count的值不会增加。

现在我们来解释为什么会这样:

首先,进入页面之后,会因为初态的问题,count和step会保持初态0和1;但是1000ms后,定时器起效了此时tick函数起作用,但是它捕获的是初态的count和step,在定时器循环的过程中,由于闭包问题,count和step一直没有得到更新,所以count不会改变。

控制台呢

你会发现callback函数中根本就没有 _countSnapshot这个属性,所以他是迷惑我们的,一直是undefined。

怎么更改

方案1

setCount((count)=> count + step);

这样就好,我们在每一次更新时,通过回调获取最新的count值。

方案2:将 tick 加入 useInterval 的依赖

修改 useInterval,使其响应 callback 的变化:

function useInterval(callback, delay) {useEffect(() => {const id = setInterval(callback, delay); // 直接使用最新的 callbackreturn () => clearInterval(id);}, [delay, callback]); // 依赖 callback
}

方案3:useRef
 

function useInterval(callback, delay) {const savedCallback = useRef();// 保存最新的回调useEffect(() => {savedCallback.current = callback;}, [callback]);// 设置定时器useEffect(() => {function tick() {savedCallback.current(); // 调用最新的回调}if (delay !== null) {const id = setInterval(tick, delay);return () => clearInterval(id);}}, [delay]);
}

“人间自有真情在 ,宜将寸心报春晖。”

http://www.dtcms.com/wzjs/338432.html

相关文章:

  • 杭州婚恋网站建设秦皇岛seo排名
  • 环保网站 下载徐州百度推广公司
  • 网站有几种语言开发的seo优化多久能上排名
  • 网站优化排名搜索引擎网站入口
  • 珠海网站友情链接域名注册哪个网站好
  • 网站如何做ssl认证百度推广培训
  • 临海 网站建设线上推广有哪些平台效果好
  • 多种东莞微信网站建设网站推广优化外包便宜
  • 个人网页设计论文免费seo免费推广
  • 郑州友网站建设seo营销推广
  • wordpress图片展主题优化大师客服电话
  • 郑州电子商务网站建设太原seo
  • 网站建设什么软件好品牌运营管理有限公司
  • 备案的网站 能拿来做仿站吗头条号权重查询
  • 网站备案不能访问刚刚中国突然宣布
  • 河间市网站建设价格公司网站如何在百度上能搜索到
  • 成都企业网站设计制作seo综合查询工具有什么功能
  • 2015年做哪些网站致富互联网营销主要学什么
  • 贵阳专业做网站公司有哪些代理公司注册
  • 网站建设历程优化推广
  • 如何登陆建设银行信用卡网站游戏推广引流
  • 做公司网站的多少钱百度网盟推广怎么做
  • 中山市企业网站seo营销工具推广软文怎么写
  • 网站设计规范互联网广告是做什么的
  • 铁门关市建设局网站小说排行榜百度搜索风云榜
  • 店面设计原则不包括seo案例
  • 做私人网站网店推广费用多少钱
  • 厦门 网站建设 网站开发大数据营销成功案例
  • wordpress 为知笔记seo外推软件
  • 成都网站建设公司官网营销技巧培训