老莫的笔记本  
  
查看: 335|回复: 0

React17 论 setState方法是同步还是异步?

[复制链接]

662

主题

878

帖子

5145

积分

超级版主

Rank: 8Rank: 8

积分
5145
发表于 2022-4-28 16:25:23 | 显示全部楼层 |阅读模式
本帖最后由 周大胖子 于 2022-4-28 17:18 编辑

1. setState 方法是同步还是异步?

    答:默认情况下setState 是异步函数,但是 如果在定时器中使用或者原生事件中使用[ 注意生命周期函数不是原生函数 原生函数指的是 原生dom 所包含的函数,这里实际上我测了 还是异步  ],它就是同步的函数;

     这个问题先暂存,以后在实际中遇到了再来解决!!!!!!!!!!!

2. setState是异步方法的意义何在?

    答:据说是因为渲染dom 比较消耗性能,所以是攒了一波一起改的意思,简单说明就是 :优化性能;

3.如何拿到更新后的数据?
   
    答: setState 有两个函数,({数据},fun)  在第二个参数也就是回调方法中就可以拿到更新后的数据



  1. class A extends React.Component{
  2.     constructor(){
  3.         super();
  4.         this.state={
  5.             eat:'凉皮凉面',
  6.             num:123
  7.         }
  8.     }
  9.    

  10.     // 注意点: 如果通过events 来实现跨组件传递数据,那么为了性能考虑 应当在组件被卸载时移除掉对应的事件
  11.     componentWillUnmount(){
  12.         eventBus.rawListeners('say',this.fuA.bind(this));
  13.     }

  14.     render(){
  15.         return (
  16.             <section>
  17.                 这是A模块{this.state.eat}
  18.                 <hr />
  19.                 <button onClick={()=>{this.testState()}}> 测试setState同步异步按钮 </button>
  20.                 <hr />
  21.                 <button id={"tt"}> 找一个原生事件 </button>
  22.                 <hr />
  23.                 <button onClick={()=>{this.testState2()}}>测试setState同步写法</button>
  24.                 {this.state.num}
  25.             </section>
  26.         );
  27.     }
  28.     componentDidMount(){
  29.         // this.setState({
  30.         //     num:777
  31.         // })
  32.         // console.log('在周期函数中运行',this.state.num)// 这里也是异步
  33.         // eventBus.addListener('say',this.fuA.bind(this));


  34.         let oBtn = document.getElementById('tt');
  35.         oBtn.onclick=()=>{
  36.             this.setState({
  37.                 num:999
  38.             })
  39.             console.log('原生事件中运行',this.state.num)// 这里是同步 额  这里居然是异步???为毛做的跟别人不一样
  40.         }
  41.     }

  42.     fuA(eat){
  43.         this.setState({
  44.             eat
  45.         })
  46.     }
  47.     testState(){
  48.         this.setState({
  49.             num:666
  50.         },()=>{
  51.             console.log('回调函数中运行',this.state.num)

  52.         })
  53.         console.log('上下文书写运行',this.state.num) // 这里是异步 数据为修改之前的
  54.     }

  55.     testState2(){
  56.         this.setState((preState,props)=>{
  57.             return {
  58.                 num:preState.num+857
  59.             }
  60.         })
  61.         this.setState((preState,props)=>{
  62.             return {
  63.                 num:preState.num+857
  64.             }
  65.         })
  66.         console.log('当setState第一个值是函数时',this.state.num) // 可能是我的打印方式有问题,这还是个异步 不过上述的文字 执行起来没问题
  67.     }

  68. }


复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表