首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么警报会显示此代码中的前一个状态?

为什么警报会显示此代码中的前一个状态?
EN

Stack Overflow用户
提问于 2019-07-22 01:38:28
回答 1查看 61关注 0票数 0

当我递增时,警报会给出实际的numRef.current值,但stateNumber的值始终是前一个值。

我知道这是由于闭包造成的,但是即使我一直在阅读作用域和闭包的工作原理,我也不明白为什么在这种情况下stateNumber的值不是当前值,因为setStateNumber是在setTimeout之前调用的,所以这个值应该已经更新了

代码语言:javascript
复制
import React, { useState, useEffect, useRef } from "react";

const RefComponent = () => {
  const [stateNumber, setStateNumber] = useState(0);
  const numRef = useRef(0);

  function incrementAndDelayLogging() {
    setStateNumber(stateNumber + 1);
    numRef.current++;
    setTimeout(
      () => alert(`state: ${stateNumber} | ref: ${numRef.current}`),
      1000
    );
  }

  return (
    <div>
      <h1>useRef Example</h1>
      <button onClick={incrementAndDelayLogging}>delay logging</button>
      <h4>state: {stateNumber}</h4>
      <h4>ref: {numRef.current}</h4>
    </div>
  );
};

export default RefComponent;
EN

回答 1

Stack Overflow用户

发布于 2019-07-22 15:00:44

代码语言:javascript
复制
function incrementAndDelayLogging() {
const newStateNumber = stateNumber + 1
setStateNumber(newStateNumber);
numRef.current++;
setTimeout(
  () => alert(`state: ${newStateNumber} | ref: ${numRef.current}`),
  1000
);

}

这可能会解决这个问题:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57135541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档