欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React?setState是異步還是同步原理解析

 更新時(shí)間:2022年11月15日 16:10:18   作者:fadeaway_shot  
這篇文章主要為大家介紹了React?setState是異步還是同步原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

setState異步更新

開發(fā)中當(dāng)組件中的狀態(tài)發(fā)生了變化,頁(yè)面并不會(huì)重新渲染。我們必須要通過setState來告知React數(shù)據(jù)已經(jīng)發(fā)生了變化,重新渲染頁(yè)面。

先來看下面的例子:

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è)計(jì)為異步呢?

setState設(shè)計(jì)為異步,可以顯著的提升性能

  • 如果每次調(diào)用setState都進(jìn)行一次更新,那么意味著render函數(shù)會(huì)被頻繁調(diào)用,界面重新渲染,這樣效率是很低的;
  • 最好的辦法是獲取多個(gè)更新,之后進(jìn)行批量處理;

如果同步更新了state,但是還沒有執(zhí)行render函數(shù),那么state和props不能保持同步;

state和props不能保持一致性,會(huì)在開發(fā)中產(chǎn)生很多的問題;(比如,組件嵌套時(shí)影響子組件中的狀態(tài))

如何獲取異步的結(jié)果

setState的回調(diào)

setState接受兩個(gè)參數(shù):第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)會(huì)在更新后會(huì)執(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版本之前

其實(shí)可以分成兩種情況:

  • 在組件生命周期或React合成事件中,setState是異步的;
  • 在setTimeout或者原生DOM事件中,setState是同步的

驗(yàn)證一:在setTimeout中的更新:

setTimeout(() => {
      this.setState({
        message: "Hello React",
      });
      console.log(this.state.message); // Hello React
 }, 0);

驗(yàn)證二:原生DOM事件:

componentDidMount() {
    const btnEl = document.querySelector("#btn");
    btnEl.addEventListener("click", () => {
      this.setState({
        message: "Hello React",
      });
      console.log(this.state.message); // Hello React
    });
  }

React18版本之后

setState默認(rèn)是異步的

  • 在React18之后,默認(rèn)所有的操作都被放到了批處理中(異步處理)

如果希望代碼可以同步拿到,則需要執(zhí)行特殊的flushSync操作:

import { flushSync } from "react-dom";
changeText() {
    flushSync(() => {
      this.setState({
        message: "Hello React",
      });
    });
    console.log(this.state.message); // Hello React
  }

以上就是React setState是異步還是同步原理解析的詳細(xì)內(nèi)容,更多關(guān)于React setState異步同步的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React?保留和重置State

    React?保留和重置State

    這篇文章主要為大家介紹了React?保留和重置State實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 淺談webpack+react多頁(yè)面開發(fā)終極架構(gòu)

    淺談webpack+react多頁(yè)面開發(fā)終極架構(gòu)

    這篇文章主要介紹了淺談webpack+react多頁(yè)面開發(fā)終極架構(gòu),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • React?JSX深入淺出理解

    React?JSX深入淺出理解

    React使用JSX來替代常規(guī)的JavaScript。JSX是一個(gè)看起來很像 XML的JavaScript語(yǔ)法擴(kuò)展。我們不需要一定使用 JSX,但它有以下優(yōu)點(diǎn):JSX執(zhí)行更快,因?yàn)樗诰幾g為JavaScript代碼后進(jìn)行了優(yōu)化。它是類型安全的,在編譯過程中就能發(fā)現(xiàn)錯(cuò)誤。使用JSX編寫模板更加簡(jiǎn)單快速
    2022-12-12
  • 詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用

    詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用

    這篇文章主要介紹了詳解使用webpack+electron+reactJs開發(fā)windows桌面應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-02-02
  • 詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式

    這篇文章主要介紹了詳解react native頁(yè)面間傳遞數(shù)據(jù)的幾種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • react實(shí)現(xiàn)瀏覽器自動(dòng)刷新的示例代碼

    react實(shí)現(xiàn)瀏覽器自動(dòng)刷新的示例代碼

    這篇文章主要介紹了react實(shí)現(xiàn)瀏覽器自動(dòng)刷新的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 關(guān)于react+antd樣式不生效問題的解決方式

    關(guān)于react+antd樣式不生效問題的解決方式

    最近本人在使用Antd開發(fā)時(shí)遇到些問題,所以下面這篇文章主要給大家介紹了關(guān)于react+antd樣式不生效問題的解決方式,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • react?echarts?tree樹圖搜索展開功能示例詳解

    react?echarts?tree樹圖搜索展開功能示例詳解

    這篇文章主要為大家介紹了react?echarts?tree樹圖搜索展開功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React學(xué)習(xí)之JSX與react事件實(shí)例分析

    React學(xué)習(xí)之JSX與react事件實(shí)例分析

    這篇文章主要介紹了React學(xué)習(xí)之JSX與react事件,結(jié)合實(shí)例形式分析了React中JSX表達(dá)式、屬性、嵌套與react事件相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • React手寫tab切換問題

    React手寫tab切換問題

    今天介紹下React手寫tab切換問題,代碼部分包括父文件,子文件及子文件tab樣式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2021-11-11

最新評(píng)論