请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在useEffect中修改state

function useStateTrap() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    const timer = setInterval(() => {
      setCount(count + 1);
      console.log("setInterval", count);
    }, 1000);

    return () => clearInterval(timer);
  }, []);
  return <div>count:{count}</div>;
}

页面显示count为1,说明setCount(count + 1)生效了,因为count初始值是0,那么请问打印结果为什么依然是 setInterval 0

正在回答 回答被采纳积分+3

1回答

双越 2021-06-03 21:53:18

这就跟 class 组件里的 setState 一样,异步更新。

你刚刚 setState({...}) 之后,没法在同步代码中获取最新的 state 的值,除非用回调函数。

可以再去回顾一下 class 组件的 setState ,当时讲的挺详细的。

0 回复 有任何疑惑可以回复我~
  • 提问者 _驺虞 #1
    在 class 组件中,setInterval 里的 setState 是同步的啊,难道在函数组件中的 setState 都是异步的?
    回复 有任何疑惑可以回复我~ 2021-06-04 17:47:01
  • 双越 回复 提问者 _驺虞 #2
    不一样。class 组件是获取 this.state 这个属性。而这里的 count 就是一个简单的 number 类型,一个简单的 js 变量。基于基本的 js 语法也能看出来。所以这里打印的就是 count 初始化的值。函数组件里 count 要变化的话,那该函数得重新执行(即组件更新)。而 useEffect(fn, []) 第二个参数是 [] ,这就表示函数更新时不会执行这个 fn 。所以归根结底这里的 count 就一直是 0 。总结:第一,注意基本的 js 语法;第二,组件时函数要重新执行、以及 useEffect 是否会重新执行?
    回复 有任何疑惑可以回复我~ 2021-06-04 23:07:41
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信