React?setState是異步還是同步原理解析
setState異步更新
開發(fā)中當組件中的狀態(tài)發(fā)生了變化,頁面并不會重新渲染。我們必須要通過setState來告知React數(shù)據(jù)已經(jīng)發(fā)生了變化,重新渲染頁面。
先來看下面的例子:
constructor() {
super();
this.state = {
message: "Hello World",
};
}
changeText() {
this.setState({
message: "Hello React",
});
console.log(this.state.message); // Hello World
}
最終打印的結(jié)果是Hello World;
可見setState是異步的操作,我們并不能在執(zhí)行完setState之后立馬拿到最新的state的結(jié)果
那么為什么setState設(shè)計為異步呢?
setState設(shè)計為異步,可以顯著的提升性能
- 如果每次調(diào)用setState都進行一次更新,那么意味著render函數(shù)會被頻繁調(diào)用,界面重新渲染,這樣效率是很低的;
- 最好的辦法是獲取多個更新,之后進行批量處理;
如果同步更新了state,但是還沒有執(zhí)行render函數(shù),那么state和props不能保持同步;
state和props不能保持一致性,會在開發(fā)中產(chǎn)生很多的問題;(比如,組件嵌套時影響子組件中的狀態(tài))
如何獲取異步的結(jié)果
setState的回調(diào)
setState接受兩個參數(shù):第二個參數(shù)是一個回調(diào)函數(shù),這個回調(diào)函數(shù)會在更新后會執(zhí)行;
changeText() {
this.setState({
message: "Hello React",
},()=>{
console.log('-----',this.state.message); // Hello React
});
}
也可以在生命周期函數(shù)中獲?。?/p>
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之后,默認所有的操作都被放到了批處理中(異步處理)

如果希望代碼可以同步拿到,則需要執(zhí)行特殊的flushSync操作:
import { flushSync } from "react-dom";
changeText() {
flushSync(() => {
this.setState({
message: "Hello React",
});
});
console.log(this.state.message); // Hello React
}以上就是React setState是異步還是同步原理解析的詳細內(nèi)容,更多關(guān)于React setState異步同步的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談webpack+react多頁面開發(fā)終極架構(gòu)
這篇文章主要介紹了淺談webpack+react多頁面開發(fā)終極架構(gòu),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用
這篇文章主要介紹了詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
詳解react native頁面間傳遞數(shù)據(jù)的幾種方式
這篇文章主要介紹了詳解react native頁面間傳遞數(shù)據(jù)的幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11
關(guān)于react+antd樣式不生效問題的解決方式
最近本人在使用Antd開發(fā)時遇到些問題,所以下面這篇文章主要給大家介紹了關(guān)于react+antd樣式不生效問題的解決方式,文中通過圖文以及實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07
react?echarts?tree樹圖搜索展開功能示例詳解
這篇文章主要為大家介紹了react?echarts?tree樹圖搜索展開功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

