状态未在控制台中显示更新值

时间:2021-03-09 09:48:00

标签: javascript reactjs

尽管页面上的文本得到更新,console.log 仍会注销初始值。为什么是这样?我知道设置状态是异步的,但为什么即使等待 1 秒后它仍然注销旧值?

import { useState, useEffect, useRef } from "react";

function App() {
  const [requestState, setRequestState] = useState("initial");

  useEffect(() => {
    setRequestState("changed");
    setTimeout(() => {
      console.log(requestState);
    }, 1000);
  }, []);

  return (
    <div className="App">
      {requestState}
    </div>
  );
}

export default App;

3 个答案:

答案 0 :(得分:1)

useEffect 会在组件渲染时运行,有条件地调用一个函数,指定依赖列表。 经验法则是始终添加您在 useEffect() 中使用的那些依赖项

    import { useState, useEffect, useRef } from "react";
    
    function App() {
    const [requestState, setRequestState] = useState("initial");
    setRequestState("changed");  
    useEffect(() => {
    setTimeout(() => {
      console.log(requestState);
    }, 1000);
    }, [requestState]);

      return (
        <div className="App">
          {requestState}
        </div>
      );
    }
    
    export default App;

答案 1 :(得分:0)

您的 useEffect 取决于 requestState 变量,因此将其传递到空列表中,如下所示:

useEffect(() => {some code},[used variables])

答案 2 :(得分:0)

useEffect() 钩子在执行时“捕获”状态和道具。这就是为什么它具有过时的价值。该值来自 useEffect() 中的函数运行时。

这是 Dan Abramov 的一篇精彩文章:https://overreacted.io/a-complete-guide-to-useeffect/。它对与您的问题几乎完全相同的问题进行了解释。通读全文以深入了解useEffect()

相关问题