React 生命周期函数 componentDidMount 渲染界面阻塞问题?

作者站长头像
站长
· 阅读数 16

请看下面代码,在 componentDidMount 中使用 setState 时,请问是异步执行还是同步执行?如果是异步执行,为什么浏览器渲染界面时被阻塞了,当我用 SetTimeout 后就不会发生阻塞浏览器渲染界面,第一次的 render 能正常显示到界面上,求解!

import React, { useState, useEffect } from 'react';

function sleep(time) {
  const now = Date.now();

  while (Date.now() - now <= time * 1000) {}
}

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      styles: {
        height: '50px',
        width: '50px',
        backgroundColor: 'blue',
        transition: 'all 1s',
        textAlign: 'center',
        color: 'white',
      },
      value: '1',
    };
  }

  componentDidMount() {
    //组件插入dom树后立即执行
    console.log(document.querySelector('#box').innerHTML);

    /*setTimeout(() => {
      this.setState({
        styles: { ...this.state.styles, height: '100px' },
        value: '2',
      });
    }, 5000);*/

    this.setState({
      styles: { ...this.state.styles, height: '100px' },
      value: '2',
    });
  }

  render() {
  
    console.log('App render');
    return (
      <>
        <div id="box" style={this.state.styles}>
          {this.state.value}
        </div>
      </>
    );
  }
}

export default App;
回复
1个回答
avatar
test
2024-07-20

我看并没有阻塞呀,不使用setTimeout,也能看到更新后的值:2。answer image

运行效果使用的代码

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容