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

淺談React多個(gè)setState會調(diào)用幾次

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

1. 兩個(gè)setState,調(diào)用幾次?

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

當(dāng)點(diǎn)擊按鈕時(shí),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>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

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

以上代碼放到瀏覽器運(yùn)行一下即可:

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

原因在于,React 內(nèi)部將同一事件響應(yīng)函數(shù)中的多個(gè)setState進(jìn)行合并,減少setState的調(diào)用次數(shù),也就能減少渲染的次數(shù),提高性能。

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

2. 兩個(gè)setState,調(diào)用的是哪一個(gè)?

但上述代碼沒有驗(yàn)證,React 合并后,到底執(zhí)行的是哪一次setState。如下代碼所示,將第二個(gè)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>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

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

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

3. 兩個(gè)setState放在setTimeout中?

若在點(diǎn)擊事件函數(shù)中,添加一個(gè)定時(shí)器setTimeout,在定時(shí)器中執(zhí)行兩次setState操作,結(jié)果又將如何?如下代碼,事件處理函數(shù)中,寫了一個(gè)定時(shí)器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>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button onClick={this.handleClick}>add</button>
        </>
    );
}

運(yùn)行結(jié)果:

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

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

4. 總結(jié)

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

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

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

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

相關(guān)文章

  • useCallback和useMemo的正確用法詳解

    useCallback和useMemo的正確用法詳解

    這篇文章主要為大家介紹了useCallback和useMemo的正確用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • React Hook 'useEffect' is called in function報(bào)錯(cuò)解決

    React Hook 'useEffect' is call

    這篇文章主要為大家介紹了React Hook 'useEffect' is called in function報(bào)錯(cuò)解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • React手寫一個(gè)手風(fēng)琴組件示例

    React手寫一個(gè)手風(fēng)琴組件示例

    這篇文章主要為大家介紹了React手寫一個(gè)手風(fēng)琴組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React中的生命周期用法詳解

    React中的生命周期用法詳解

    這篇文章主要介紹了React中的生命周期用法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

    React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定

    這篇文章主要介紹了React使用hook如何實(shí)現(xiàn)數(shù)據(jù)雙向綁定方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • React Agent 自定義實(shí)現(xiàn)代碼

    React Agent 自定義實(shí)現(xiàn)代碼

    在使用langchain的ReactAgent遇到問題后,作者嘗試自定義ReactAgent實(shí)現(xiàn),通過詳細(xì)分析langchain中的agent功能和問題,結(jié)合React思想,作者設(shè)計(jì)了新的agent邏輯并在GitHub上分享了代碼,新的ReactAgent通過改進(jìn)prompt和工具調(diào)用邏輯,提升了任務(wù)執(zhí)行的效果和穩(wěn)定性
    2024-10-10
  • React前端DOM常見Hook封裝示例下

    React前端DOM常見Hook封裝示例下

    這篇文章主要為大家介紹了React前端DOM常見Hook封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    本文主要介紹了React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 解析TypeError:import_react_native.AppState.removeEventListener?is?not?a?function

    解析TypeError:import_react_native.AppState.removeEventListener

    這篇文章主要為大家介紹了TypeError:import_react_native.AppState.removeEventListener?is?not?a?function問題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • react 不用插件實(shí)現(xiàn)數(shù)字滾動的效果示例

    react 不用插件實(shí)現(xiàn)數(shù)字滾動的效果示例

    這篇文章主要介紹了react 不用插件實(shí)現(xiàn)數(shù)字滾動的效果示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論

凌云县| 乐亭县| 恭城| 石阡县| 枣庄市| 余江县| 西峡县| 元氏县| 临高县| 香格里拉县| 城口县| 教育| 内乡县| 卢氏县| 淄博市| 葫芦岛市| 讷河市| 博罗县| 祁门县| 通榆县| 海淀区| 乐清市| 文山县| 峨边| 突泉县| 肇源县| 苗栗市| 蒲江县| 西峡县| 乐亭县| 白河县| 福鼎市| 长治县| 高邮市| 八宿县| 海晏县| 郯城县| 进贤县| 青冈县| 深圳市| 彝良县|