在介绍这个问题之前,我们先来看一下一个例子:

state = {
number:1
};
componentDidMount(){
this.setState({number:3})
console.log(this.state.number)
}

看完这个例子,也许很多小伙伴会下意识的以为setState是一个异步方法,但是其实setState并没有异步的说法,之所以会有一种异步方法的表现形式,归根结底还是因为react框架本身的性能机制所导致的。因为每次调用setState都会触发更新,异步操作是为了提高性能,将多个状态合并一起更新,减少re-render调用。

试想一下如果在组件中有以下这样一段代码执行:

for ( let i = 0; i < 100; i++ ) {
this.setState( { num: this.state.num + 1 } );
}

如果setState是一个同步执行的机制,那么这个组件会被重新渲染100次,这对性能是一个相当大的消耗。

显然,React也是想到了这个问题,因此对setState做了一些特殊的优化:

React会将多个setState的调用合并为一个来执行,也就是说,当执行setState的时候,state中的数据并不会马上更新

这也很好的印证了刚才提到的那个例子。

但是往往在实际的开发工作中,我们可能需要同步的获取到更新之后的数据,那么怎么获取呢?下面介绍几种常用的方法:
回调函数

setState提供了一个回调函数供开发者使用,在回调函数中,我们可以实时的获取到更新之后的数据。还是以刚才的例子做示范:

state = {
number:1
};
componentDidMount(){
this.setState({number:3},()=>{
console.log(this.state.number)
})
}

这个时候大家可以看到控制台打印的数据就是最新的了,我们也就实时的获取到了最新的数据。
setTimeout

上面我们讲到了,setState本身并不是一个异步方法,其之所以会表现出一种异步的形式,是因为react框架本身的一个性能优化机制。那么基于这一点,如果我们能够越过react的机制,是不是就可以令setState以同步的形式体现了呢?

说再多文字不如代码实践,实践才是检验真理的唯一标准,下面我们还是以之前的例子为基础改造一下代码:

state = {
number:1
};
componentDidMount(){
setTimeout(()=>{
this.setState({number:3})
console.log(this.state.number)
},0)
}

可以看见此时控制台打印的数据是最新的数据。这也完美的印证了我们的猜想是正确的。
原生事件中修改状态

上面已经印证了避过react的机制,可以同步获取到更新之后的数据,那么除了setTimeout以外,还有在原生事件中也是可以的。还是看一下例子:

state = {
number:1
};
componentDidMount() {
document.body.addEventListener(‘click’, this.changeVal, false);
}
changeVal = () => {
this.setState({
number: 3
})
console.log(this.state.number)
}

更多内容请见原文,原文转载自:https://blog.csdn.net/weixin_44519496/article/details/118612230

最新文章

  1. C语言-两个库函数
  2. jQuery HTML 操作
  3. PostGIS ShapeFile 导入数据
  4. 解析ASP.NET Mvc开发之EF延迟加载
  5. 《淘宝技术这十年》之LAMP架构的网站
  6. SAP Adapter启动报错
  7. 1、android orm之greendao
  8. IOS 免受xib自动布局影响
  9. 转:Java HashMap实现详解
  10. 【@Transactional】Spring 之注解事务 @Transactional
  11. Amazon EC2上搭建VPN服务器
  12. UVA 11402 - Ahoy, Pirates!(段树)
  13. SpringMVC注释启用
  14. EChart 猜猜乐
  15. Git学习一:基本用法
  16. vue项目使用阿里巴巴矢量图标库教程
  17. 使用pageoffice进行多个文档的合并
  18. c#如何解析时区字符串
  19. unidbgrid单元格操作
  20. 牛客网-《剑指offer》-矩形覆盖

热门文章

  1. Django中间件、csrf跨站请求、csrf装饰器、基于django中间件学习编程思想
  2. 【LeetCode】76. 最小覆盖子串
  3. .NET MAUI RC 是完整的 API 并准备好起飞 (GA)
  4. 用 GraphScope 像 NetworkX 一样做图分析
  5. 全栈交叉编译X86完成过程经验分享
  6. XCTF练习题---MISC---神奇的Modbus
  7. vue 设置动态标题
  8. 实现Linux系统的回收站
  9. 这样理解 HTTP,面试再也不用慌了~
  10. web安全之自己写一个扫描器