React setState是异步还是同步原理解析
setState异步更新
开发中当组件中的状态发生了变化,页面并不会重新渲染。我们必须要通过setState来告知React数据已经发生了变化,重新渲染页面。
先来看下面的例子:
constructor() {
super();
this.state = {
message: "Hello World",
};
}
changeText() {
this.setState({
message: "Hello React",
});
console.log(this.state.message); // Hello World
}
最终打印的结果是Hello World;
可见setState是异步的操作,我们并不能在执行完setState之后立马拿到最新的state的结果
那么为什么setState设计为异步呢?
setState设计为异步,可以显著的提升性能
- 如果每次调用setState都进行一次更新,那么意味着render函数会被频繁调用,界面重新渲染,这样效率是很低的;
- 最好的办法是获取多个更新,之后进行批量处理;
如果同步更新了state,但是还没有执行render函数,那么state和props不能保持同步;
state和props不能保持一致性,会在开发中产生很多的问题;(比如,组件嵌套时影响子组件中的状态)
如何获取异步的结果
setState的回调
setState接受两个参数:第二个参数是一个回调函数,这个回调函数会在更新后会执行;
changeText() {
this.setState({
message: "Hello React",
},()=>{
console.log('-----',this.state.message); // Hello React
});
}
也可以在生命周期函数中获取:
componentDidUpdate(prevProps, prevState, snapshot){
console.log(this.state.message);// Hello React
}
setState一定是异步的吗?
React18版本之前
其实可以分成两种情况:
- 在组件生命周期或React合成事件中,setState是异步的;
- 在setTimeout或者原生DOM事件中,setState是同步的
验证一:在setTimeout中的更新:
setTimeout(() => {
this.setState({
message: "Hello React",
});
console.log(this.state.message); // Hello React
}, 0);
验证二:原生DOM事件:
componentDidMount() {
const btnEl = document.querySelector("#btn");
btnEl.addEventListener("click", () => {
this.setState({
message: "Hello React",
});
console.log(this.state.message); // Hello React
});
}
React18版本之后
setState默认是异步的
- 在React18之后,默认所有的操作都被放到了批处理中(异步处理)

如果希望代码可以同步拿到,则需要执行特殊的flushSync操作:
import { flushSync } from "react-dom";
changeText() {
flushSync(() => {
this.setState({
message: "Hello React",
});
});
console.log(this.state.message); // Hello React
}以上就是React setState是异步还是同步原理解析的详细内容,更多关于React setState异步同步的资料请关注脚本之家其它相关文章!
相关文章
React-Native TextInput组件详解及实例代码
这篇文章主要介绍了React-Native TextInput组件详解及实例代码的相关资料,需要的朋友可以参考下2016-10-10
reset.css浏览器默认样式表重置(user agent stylesheet)的示例代码
这篇文章主要介绍了reset.css浏览器默认样式表重置(user agent stylesheet),本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-12-12
React中的stopPropagation和preventDefault实践记录
本文详细介绍了事件冒泡、捕获与React合成事件体系下的表现区别,包括事件传播阶段、处理方式、事件池机制等核心概念,对React stopPropagation和preventDefault相关知识感兴趣的朋友跟随小编一起看看吧2025-11-11


最新评论