useState 在定时器和promise中的执行问题

发布于 2022-09-12 04:11:21 字数 1191 浏览 14 评论 0

image.png
为什么 setLoading 和 setSecond 在Promise和setimeout中执行会分别出发两次render,而直接调用的话只会触发一次render
注明: 这里去除useEffect执行前的首次渲染
效果如下
image.png

代码:

function App() {
  const ref = useRef(0)
  const [loading, setLoading] = useState(true);
  const [second, setSecond] = useState([]);
  useEffect(() => {
    console.log('useEffectuseEffectuseEffect')
    setLoading(true)
    
    /**
     * 包含在Promise和setTimeout中 
     * 执行setLoading和setSecond会分别执行两次渲染
     */
    Promise.resolve().then(() => {
      console.log('Promise')
      setLoading(false)
      setSecond([1, 3, 4])
    })
    // setTimeout(() => {
    //   setLoading(false)
    //   setSecond([1, 3, 4])
    // }, 1000)

    // 执行setLoading和setSecond只执行一次渲染
    // setLoading(false)
    // setSecond([1, 3, 4])
  }, []);
  // console.log('mounted ----->', ++ref.current, second)
  return (
    <div>
      { (function() { console.log('render ----->', ref.current, second) })()  }
      { loading && (function(){console.log('loading...')})() }
    </div>
  );
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

微凉 2022-09-19 04:11:21

react 的batchUpdate 问题,在非react生命周期内以及合成时间内(比如原声事件监听、Promise回调函数、定时器中),react无法预知行为,无法批量合并更新,class组件也一样,可以讲setState或setxxx 放进unstable_batchedUpdates(() => {setXXX();setXXX()})进行批量更新

梦里人 2022-09-19 04:11:21

异步中的变更操作是同步的,不会去收集,所以每次更新都会触发render。 class组件也是一样的表现

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文