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

淺談React多個setState會調用幾次

 更新時間:2021年11月12日 09:57:52   作者:火星飛鳥  
在React的生命周期鉤子和合成事件中,多次執(zhí)行setState,會被調用幾次,本文就詳細的介紹一下,感興趣的可以了解一下

1. 兩個setState,調用幾次?

如下代碼所示,state中有一個count。對按鈕綁定了點擊事件,事件中執(zhí)行了兩次setState,每次都將count的值加1。

當點擊按鈕時,setState會執(zhí)行幾次?render()會執(zhí)行幾次?

答案:都是1次。

state = { count: 0 };
handleClick = () => {
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 1 });
};
render() {
    console.log(`render`);
    return (
        <>
            <div>當前計數:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

按照常理來說,第一次點擊按鈕時,由于執(zhí)行了兩次兩次setState,每次都將count的值進行加1,render()應該會執(zhí)行兩次,最后count的值應該是2。但是 React 并不是這么執(zhí)行的。

以上代碼放到瀏覽器運行一下即可:

最開始時,頁面顯示count的值為0,控制臺打印出render,這是 React 首次渲染時打印的。當點擊完按鈕后,頁面顯示count值是1,同時也只打印了1render,說明在這過程中 React 只執(zhí)行了一次setState,只執(zhí)行了一次render()渲染操作。

原因在于,React 內部將同一事件響應函數中的多個setState進行合并,減少setState的調用次數,也就能減少渲染的次數,提高性能。

這也就解釋了上述代碼,為什么最后count的值是1,因為 React 將兩個setState進行了合并,最終只執(zhí)行了1次,render()也只執(zhí)行了一次。

2. 兩個setState,調用的是哪一個?

但上述代碼沒有驗證,React 合并后,到底執(zhí)行的是哪一次setState。如下代碼所示,將第二個setState中,對count的操作改為加2,其余代碼保持不變:

state = { count: 0 };
handleClick = () => {
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 2 }); // 改為+2
};
render() {
    console.log(`render`);
    return (
        <>
            <div>當前計數:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

再次放到瀏覽器中執(zhí)行:

結果顯示,點擊按鈕后,count的值最終變成了2,也就是進行了+2的操作,render()也只執(zhí)行了1次。這就說明 React 在合并多個setState時,若出現(xiàn)同名屬性,會將后面的同名屬性覆蓋掉前面的同名屬性??梢赃@么理解,對于同名屬性,最終執(zhí)行的的是最后setState中的屬性。

3. 兩個setState放在setTimeout中?

若在點擊事件函數中,添加一個定時器setTimeout,在定時器中執(zhí)行兩次setState操作,結果又將如何?如下代碼,事件處理函數中,寫了一個定時器setTimeout,將兩次setState放入setTimeout中。

state = { count: 0 };
handleClick = () => {
    setTimeout(() => {
        this.setState({ count: this.state.count + 1 });
        this.setState({ count: this.state.count + 2 });
    }, 0);
};
render() {
    console.log(`render`);
    return (
        <>
            <div>當前計數:{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

運行結果:

結果顯示,點擊按鈕后,count的值最終變成了3,也就+1+2的操作都執(zhí)行了,render()也執(zhí)行了2次。

這是因為在 React 的合成事件生命周期函數中直接調用setState,會交由 React 的性能優(yōu)化機制管理,合并多個setState。而在原生事件、setTimeout中調用setState,是不受 React 管理的,故并不會合并多個setState,寫了幾次setState,就會調用幾次setState。

4. 總結

在 React 中直接使用的事件,如onChange、onClick等,都是由 React 封裝后的事件,是合成事件,由 React 管理。

React 對于合成事件和生命周期函數,有一套性能優(yōu)化機制,會合并多個setState,若出現(xiàn)同名屬性,會將后面的同名屬性覆蓋掉前面的同名屬性

若越過 React 的性能優(yōu)化機制,在原生事件、setTimeout中使用setState,就不歸 React 管理了,寫了幾次setState,就會調用幾次setState。

到此這篇關于淺談React多個setState會調用幾次的文章就介紹到這了,更多相關淺談React多個setState會調用幾次內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于antd的autocomplete的二次封裝查詢示例

    基于antd的autocomplete的二次封裝查詢示例

    這篇文章主要為大家介紹了基于antd的autocomplete的二次封裝查詢示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • react-native彈窗封裝的方法

    react-native彈窗封裝的方法

    這篇文章主要為大家詳細介紹了react-native彈窗封裝的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React路由鑒權的實現(xiàn)方法

    React路由鑒權的實現(xiàn)方法

    這篇文章主要介紹了React路由鑒權的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 無廢話快速上手React路由開發(fā)

    無廢話快速上手React路由開發(fā)

    本文以簡潔為目標,幫助快速上手react-router-dom默認你接觸過路由相關的開發(fā),通過實例代碼講解的很詳細,對React路由相關知識感興趣的朋友一起看看吧
    2021-05-05
  • 解決React初始化加載組件會渲染兩次的問題

    解決React初始化加載組件會渲染兩次的問題

    這篇文章主要介紹了解決React初始化加載組件會渲染兩次的問題,文中有出現(xiàn)這種現(xiàn)象的原因及解決方法,感興趣的同學跟著小編一起來看看吧
    2023-08-08
  • 詳解react使用react-bootstrap當輪子造車

    詳解react使用react-bootstrap當輪子造車

    本篇文章主要介紹了詳解react使用react-bootstrap當輪子造車,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-08-08
  • react 父子組件之間通訊props

    react 父子組件之間通訊props

    這篇文章主要介紹了react 父子組件之間通訊props,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • React實現(xiàn)簡單登錄的項目實踐

    React實現(xiàn)簡單登錄的項目實踐

    登錄、注冊、找回密碼是前端項目經常遇到的需求,本文主要介紹了React實現(xiàn)簡單登錄的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • react中hooks使用useState的更新不觸發(fā)dom更新問題及解決

    react中hooks使用useState的更新不觸發(fā)dom更新問題及解決

    這篇文章主要介紹了react中hooks使用useState的更新不觸發(fā)dom更新問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • react+redux的升級版todoList的實現(xiàn)

    react+redux的升級版todoList的實現(xiàn)

    本篇文章主要介紹了react+redux的升級版todoList的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論