最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年11月15日 16:10:18   作者:fadeaway_shot  
這篇文章主要為大家介紹了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)文章

  • 關(guān)于react-router-dom路由入門教程

    關(guān)于react-router-dom路由入門教程

    這篇文章主要介紹了關(guān)于react-router-dom路由入門教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • React組件化條件渲染的實現(xiàn)

    React組件化條件渲染的實現(xiàn)

    本文主要介紹了React組件化條件渲染的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • react高階組件經(jīng)典應(yīng)用之權(quán)限控制詳解

    react高階組件經(jīng)典應(yīng)用之權(quán)限控制詳解

    在React中,高階組件是重用組件邏輯的一項高級技術(shù)。下面這篇文章主要給大家介紹了關(guān)于react高階組件經(jīng)典應(yīng)用之權(quán)限控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • React-Native TextInput組件詳解及實例代碼

    React-Native TextInput組件詳解及實例代碼

    這篇文章主要介紹了React-Native TextInput組件詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • React?中的Props特性及其應(yīng)用

    React?中的Props特性及其應(yīng)用

    Render?Props?提供了一種更簡潔、更靈活的方式來共享組件的狀態(tài)和行為,本文將詳細介紹?Render?Props?的概念、實現(xiàn)方法及其應(yīng)用場景,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • reset.css瀏覽器默認樣式表重置(user?agent?stylesheet)的示例代碼

    reset.css瀏覽器默認樣式表重置(user?agent?stylesheet)的示例代碼

    這篇文章主要介紹了reset.css瀏覽器默認樣式表重置(user?agent?stylesheet),本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • 從零開始搭建一個react項目開發(fā)

    從零開始搭建一個react項目開發(fā)

    這篇文章主要介紹了從零開始搭建一個react項目開發(fā),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • React中的stopPropagation和preventDefault實踐記錄

    React中的stopPropagation和preventDefault實踐記錄

    本文詳細介紹了事件冒泡、捕獲與React合成事件體系下的表現(xiàn)區(qū)別,包括事件傳播階段、處理方式、事件池機制等核心概念,對React?stopPropagation和preventDefault相關(guān)知識感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • React中使用Axios進行HTTP請求

    React中使用Axios進行HTTP請求

    這篇文章主要為大家展示了如何在 React 中使用 Axios 進行 HTTP 請求,包括 GET 和 POST 請求的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • react實現(xiàn)Radio組件的示例代碼

    react實現(xiàn)Radio組件的示例代碼

    這篇文章主要介紹了react實現(xiàn)Radio組件的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

恩施市| 德令哈市| 广平县| 旌德县| 手游| 五指山市| 宝应县| 彝良县| 潼关县| 芜湖市| 洛川县| 定边县| 开化县| 龙门县| 施秉县| 平利县| 梁河县| 澎湖县| 津南区| 原平市| 馆陶县| 富宁县| 洱源县| 石林| 龙南县| 克山县| 南涧| 孟州市| 洪泽县| 柞水县| 连平县| 花莲市| 东宁县| 兴义市| 福鼎市| 中山市| 来凤县| 铜山县| 九寨沟县| 驻马店市| 五河县|