state

state的存在是为了动态改变组件,比如根据不同的用户操作和网络请求,来重新渲染组件。

setState()是React给我们的一个API,用来改变或定义state。

setState()的批量操作(batching)

在一个事件handler函数中,不管setState()被调用多少次,他们也会在函数执行结束以后,被归结为一次重新渲染, 可以优化性能, 这个等到最后一起执行的行为被称为batching

所以在函数内的setState()是有序的,如果要更改同一个state key,最后被调用的总会覆盖之前的。

因为batching的存在,所以这样的代码会和期待有出入。

//假设现在this.state.value = 0;function eventHandler(){this.setState({value:this.state.value + 1});this.setState({value:this.state.value + 1});this.setState({value:this.state.value + 1});
}//最后this.state.value仍然会是1,不是3;

所以不能依赖this.state来计算未来状态。如果想实现这样的效果,应该传一个函数给setState。这个函数有两个参数,第一个为previous state,第二个为props。这里的例子和props无关,只需要第一个参数,所以要达到效果,代码是这样

// 假设 this.state = { value: 0 };function eventHandler(){this.setState((state) => ({ value: state.value + 1}));this.setState((state) => ({ value: state.value + 1}));this.setState((state) => ({ value: state.value + 1}));
}//现在this.state.value === 3;

到这里我们得到结论,setState是异步执行的。

如React文档所说:

"setState() does not immediately mutate this.state but creates a pending state transition. Accessing this.state after calling this method can potentially return the existing value. There is no guarantee of synchronous operation of calls to setState and calls may be batched for performance gains."

所以当更新state,然后想打印state的时候,应该使用回调。

this.setState({key: val},()=>console.log(this.state));    

所以setState总是异步的,吗?

当setState()不在事件Handler函数中,如在使用ajax的时候,这种batching的异步表现又不会发生


promise.then(() => {// 不在事件函数中,所以setState立刻执行this.setState({a: true}); // 重新渲染 {a: true, b: false }this.setState({b: true}); // 重新渲染 {a: true, b: true }
});

同步异步要分情况来看:

1. React事件函数使用,像这样用最常用的形式绑定函数

constructor(props){...this.onClick = this.onClick.bind(this);
}onClick(){this.setState({key:val});
}render(){return(<div><button onClick = {this.onClick}>Click me</button></div>
}

这里batching发生,异步表现,是因为这种常规情景下React “知道”什么时候退出该事件,什么时候进行Batch Update。原理可以参考这篇很简洁易懂的文章

2.其他情景,如上面的ajax情景,或这样用addEventListener绑定函数

componentDidMount(){document.querySelector('#btn').addEventListener('click,this.onClick);
}render(){return(<div><button id="btn">Click me</button></div>}
}

脱离了React的控制,React不知道如何进行Batch Update,setState()就会是同步的。

理解setState(),异步还是同步?相关推荐

  1. React setState 的异步与同步

    目录 前言 先看一个例子 setState 为什么不会同步更新组件? 探秘setState 源码 事务 整体流程回顾: 再看一个例子: 结语 前言 react 官网:State 的更新可能是异步的 详 ...

  2. 关于“异步复位,同步复位,异步复位同步释放”的理解

    文章目录 1. 异步复位 2. 同步复位 3. 异步复位同步释放 今天好好理一理异步复位,同步复位,以及亚稳态中的异步复位同步释放. 1. 异步复位 一般让复位信号低电平有效 复位信号不受时钟的控制, ...

  3. Java 异步与同步的区别

    同步: 所有操作完成之后,才会通知用户操作完成了. 异步:不用等所有操作完成之后,就会通知用户操作完成了,然后后台会继续操作直到完成结束. 为了方便理解 举例个常见的 android 网络请求使用的异 ...

  4. 那些年让你迷惑的阻塞、非阻塞、异步、同步

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清 ...

  5. verilog异步复位jk触发器_异步复位同步释放原理

    关键词:同步释放,recovery,removal 在数字IC设计中肯定会涉及到异步复位的问题,因为需要对电路进行复位操作.这种复位设计主要依靠前端设计以及工具来检查,从数字IC后端的角度上讲,只要在 ...

  6. recvfrom函数 非阻塞_那些年让你迷惑的阻塞、非阻塞、异步、同步

    那些年让你迷惑的阻塞.非阻塞.异步.同步 在IT圈混饭吃,不管你用什么编程语言.从事前端还是后端,阻塞.非阻塞.异步.同步这些概念,都需要清晰地掌握,否则,怎么与面试官谈笑风生(chui niu pi ...

  7. jQuery 异步和同步请求

    在jQuery Ajax里面有一个async 参数 , 默认值 为true , 请求为异步请求 , false 为同步请求 .. 使用ajax加载数据返回页面并赋值,然后前端取出该值 这其中涉及到代码 ...

  8. JavaScript中的异步、同步

    要理解JS中的异步.同步,需要先了解JS代码的执行过程和Event Loop. JavaScript代码的执行过程 程序需要执行的操作都会被放入Call Stack(A LIFO (Last In, ...

  9. 异步复位同步释放原理

    深度揭秘异步复位同步释放原理 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 明天就放端午小长假了,提前祝大家节日快乐.腾讯官网已经给小编公众号开通了赞赏功 ...

  10. 阻塞和非阻塞IO,异步和同步IO

    从网上看到一遍比较好的博客介绍阻塞和非阻塞IO,异步和同步IO的区别和各自的使用场景,虽然是从网络套接字方面解析的,不过也是适合于对驱动文件的操作,毕竟套接字的本质也是一个文件描述符. 转载内容 本文 ...

最新文章

  1. ICML2021 | 自提升策略规划真实且可执行的分子逆合成路线
  2. 命名实体识别新SOTA:改进Transformer模型
  3. html怎么让五张照片并排显示,最考验右脑5张照片,30s内能发现问题都是牛人,PS做不出来...
  4. 如何在Web用户控件中引用样式表中的样式
  5. fireFox IE刷新不提示
  6. caffe win 还是 linux,caffe的windows版本安装,超级简单
  7. 如何打日志才能方便排查问题?
  8. 12. Element attributes 属性
  9. MongoDB数据库基础教程
  10. iphone显示不了wifi已连接服务器,苹果手机显示已经连接wifi但是不能上网如何解决...
  11. 周记——20150907
  12. 投稿状态(status)记录 IEEE wireless communications letters (IEEE WCL)
  13. 前端 day01 常用基础语法
  14. centos 虚拟机输入大小写混乱问题
  15. 说说你对AQS的理解?
  16. GreenPlum的Primary和Mirro切换恢复
  17. lol微信登录服务器,lol开放微信登录功能 lol微信怎么登陆
  18. 计算机操作员考评标准,计算机操作员职业技能鉴定标准高级.doc
  19. 国产六大CPU:飞腾、鲲鹏、龙芯、海光、申威、兆芯
  20. Macbook M1开启允许任意来源应用

热门文章

  1. python 自动化框架_学会Python+Selenium,分分钟搭建Web自动化框架!
  2. cookie可存的最大限制_cookie、localStorage、sessionStorage、
  3. c语言log_Morn:一个极简的C语言日志
  4. sql server datetime取年月_快速定位数据库性能问题,RDS推出慢SQL统计分析
  5. Java中的SPI(Service Provider Interface介绍及示例
  6. 使用OpenSSL生成私钥(Private Key)以及根据Private Key创建证书
  7. MATLAB基础学习笔记01:初探MATLAB世界
  8. 大数据学习笔记17:MR案例——分区统计总利润与平均利润
  9. 无心剑中译马塞尔·普鲁斯特《追忆似水年华》
  10. 【BZOJ1082】【codevs2456】栅栏,让人抓狂的优化剪枝