当两个setState同时执行时

当两个setState同时执行时

例如render函数

class App extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props)
    this.state = {
      count: 0
    }
  }

  render() {
    console.log("Render Function worked!")
    console.log(this.state.count)
    return (
      <div className={styles.child}
             onClick={() => {
                this.setState((preState) => { return { count: preState.count + 1 } }, () => {
                  ;
                })
                this.setState((preState) => { return { count: preState.count + 1 } }, () => {
                  ;
                })
             }}
        >
          <div>{this.state.count}</div> 
        </div>
    );
  }
 
}

问题1, 第一次打开页面会打印2次render()函数中的内容为什么?

https://img1.sycdn.imooc.com//climg/64e2e3470956316a02490080.jpg

问题2, 当点击目标元素时, 执行两个setState(), 因为react会对setState进行合并和批量延迟更新, 所以两个preState中count先后为0和1, 最终this.state.count数据的变化是只更新数据而不进行渲染的吗? 如果是, 更新的数据是暂存在虚拟DOM中的吗, 直到所有数据更新完再渲染到页面上?

问题3, 在最后一个setState异步更新完数据后, 所有setState(preState, callback)中的回调函数是依次执行的吗?

问题4, 点击元素控制台为何打印如下?

https://img1.sycdn.imooc.com//climg/64e2e53d0990748a01830084.jpg

count为2可以理解, 但为什么render函数会执行两次, 是因为有两个setState()吗?

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,解答如下仅供参考:

1、第一次打开页面时会发生两次打印,是因为有待更新的一个概念在,react在未来的某个不确定的时间更新视图时,react会给出一个标记相当于是说调用了setState的组件需要待更新。然后随着先后顺序进行更新,但是在每次更新的时候生命周期都会从新开始按照顺序执行。所以会导致有可能会被执行两次或者是多次。

2、老师这里提到的生命周期的变化,state还会停留在上一次操作中,所以就不涉及到后续的更新。

3、使得,你可以打印一下看到结果。

4、对。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师