请稍等 ...
×

采纳答案成功!

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

useState异步更新的问题

flushSync(() => {
setCount(() => count + 1)
})
flushSync(() => {
setCount(() => count + 1)
})
flushSync(() => {
setCount(() => count + 1)
})
flushSync(() => {
setCount(() => count + 1)
})
老师,这种写法上,我理解 setCount会批量合并,计数会+1, 但是render应该会执行4次才对,但是实际经过测试,render只会渲染2遍;即使增加再多的flushSync也不行。

flushSync(() => {
setCount(count => count + 1)
})
flushSync(() => {
setCount(count => count + 1)
})
flushSync(() => {
setCount(count => count + 1)
})
flushSync(() => {
setCount(count => count + 1)
})
只有这种写法下,才跟你讲解的一致,为什么上面那种写法,不使用上次的值,render最多只渲染2次

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

3回答

weixin_慕瓜1443996 2023-08-24 14:18:44

setCount()如果传进去的是个回调函数的话,必须得把参数作为旧值,传进去

1 回复 有任何疑惑可以回复我~
河畔一角 2023-08-25 12:26:19

你上面第一种写法不对,要把count当做参数传递进去而不是取最外面的值

0 回复 有任何疑惑可以回复我~
  • const handBtnClick = () => {
        setTimeout(() => {
          setCount(count + 1)
          setCount(count + 1)
          setCount(count + 1)
          setCount(count + 1)
        }, 10)
      }
    
    // 这种写法在react18中会进行合并,渲染一次,符合预期, 但是在react17中,setimeout中应该是同步执行,理论上应该是渲染4次,但是实际只渲染了2次, 传入函数时才会渲染4次,具体原因是什么
    回复 有任何疑惑可以回复我~ 2023-08-27 20:23:25
  • 没具体研究过17,回答不了。
    回复 有任何疑惑可以回复我~ 2023-08-27 20:25:48
qq_慕尼黑6518176 2023-08-24 08:01:56
你上面那种写法,count 只会➕1 render两次
0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号