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

關(guān)于React中setState同步或異步問題的理解

 更新時(shí)間:2021年11月12日 10:15:06   作者:火星飛鳥  
相信很多小伙伴們都一直在疑惑,setState 到底是同步還是異步。本文就詳細(xì)的介紹一下React中setState同步或異步問題,感興趣的可以了解一下

1. setState同步?異步?

在 React 的類式組件中,我們可以使用setState方法更新state狀態(tài)。但有些時(shí)候使用setState之后,得不到最新的數(shù)據(jù)。

其實(shí) React 中setState本身執(zhí)行的過程和代碼是同步的,只是因?yàn)?React 框架本身的性能優(yōu)化機(jī)制而導(dǎo)致的。React 中合成事件和生命周期函數(shù)的調(diào)用順序在更新之前,導(dǎo)致在合成事件和生命周期函數(shù)中無法立刻得到更新后的值,形成了異步的形式。

假如在一個(gè)合成事件中,循環(huán)調(diào)用了setState方法n次,如果 React 沒有優(yōu)化,當(dāng)前組件就要被渲染n次,這對(duì)性能來說是很大的浪費(fèi)。所以,React 為了性能原因,對(duì)調(diào)用多次setState方法合并為一個(gè)來執(zhí)行。當(dāng)執(zhí)行setState的時(shí)候,state中的數(shù)據(jù)并不會(huì)馬上更新。

前面已經(jīng)說到,在 React 的合成事件和生命周期函數(shù)中直接調(diào)用setState,會(huì)表現(xiàn)出異步的形式。

除此之外,如果越過 React 的性能優(yōu)化機(jī)制,在原生事件、setTimeout中使用setState,就會(huì)表現(xiàn)出同步的形式。

2. 表現(xiàn)為異步

1. React 合成事件

在 React 中直接使用的事件,如onChange、onClick等,都是由 React 封裝后的事件,是合成事件,由 React 管理。那么由于性能優(yōu)化的機(jī)制,在合成事件中直接調(diào)用setState,將表現(xiàn)出異步的形式。

如下代碼,在合成事件onClick中,直接將state中的count加1,并在此之后打印count的值,結(jié)果第一次點(diǎn)擊按鈕時(shí),會(huì)打印出0,而不是最新的1。

state = { count: 0 };
add = () => {
    this.setState({ count: this.state.count + 1 });
    console.log(this.state.count); // 0
};
render() {
    return (
        <>
            <div>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button onClick={this.add}>add</button>
        </>
    );
}

2. 生命周期函數(shù)

生命周期函數(shù)也是由 React 所管理,在生命周期函數(shù)中直接調(diào)用setState,也會(huì)表現(xiàn)出異步的形式。

如下代碼,在生命周期componentDidMount函數(shù)中,將state中的count加1,并在此之后打印count的值,結(jié)果打印出0,而不是最新的1。

state = { count: 0 };
componentDidMount() {
    this.setState({ count: this.state.count + 1 });
    console.log(this.state.count); // 0
}
render() {
    return (
        <>
            <div>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button>add</button>
        </>
    );
}

3. 表現(xiàn)為同步

1. 原生事件

setState本身執(zhí)行的過程是同步的,使用原生事件,繞過 React 的管理,將表現(xiàn)出同步的形式。

如下代碼,通過id獲取到 DOM 元素,用原生方法綁定點(diǎn)擊事件。在點(diǎn)擊事件中,將state中的count加1,并在此之后打印count的值,結(jié)果會(huì)打印最新的count值1。

state = { count: 0 };
componentDidMount() {
    const btn = document.getElementById('btn');
    btn.onclick = () => {
        this.setState({ count: this.state.count + 1 });
        console.log(this.state.count); // 1
    };
}
render() {
    return (
        <>
            <div>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button id="btn">add</button>
        </>
    );
}

2. setTimeout

如下代碼,在生命周期componentDidMount函數(shù)中寫了一個(gè)定時(shí)器setTimeout,在setTimeout內(nèi)部將state中的count加1,并在此之后打印count的值,結(jié)果會(huì)打印最新的count值1。

setState雖然也是寫在生命周期componentDidMount函數(shù)中的,但并不是直接寫在componentDidMount里,而是套了一層setTimeout。這樣,setState就表現(xiàn)出同步的形式。

state = { count: 0 };
componentDidMount() {
    setTimeout(() => {
        this.setState({ count: this.state.count + 1 });
        console.log(this.state.count); // 1
    }, 0);
}
render() {
    return (
        <>
            <div>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button>add</button>
        </>
    );
}

4. setState的第二個(gè)參數(shù)

無論setState的對(duì)象式寫法,還是函數(shù)式寫法,都有第二個(gè)參數(shù),為可選的回調(diào)函數(shù),這個(gè)回調(diào)函數(shù)在狀態(tài)更新完畢、界面也更新后(render調(diào)用后)才被調(diào)用。

如下代碼所示,setState雖然直接在componentDidMount中調(diào)用,但在setState的回調(diào)函數(shù)中打印count的值,得到了最新的值1,因?yàn)榛卣{(diào)函數(shù)在狀態(tài)更新完畢后才被調(diào)用,當(dāng)然能得到最新的count了。

state = { count: 0 };
componentDidMount() {
    this.setState({ count: this.state.count + 1 }, () => {
        console.log(this.state.count); // 1
    });
}
render() {
    return (
        <>
            <div>當(dāng)前計(jì)數(shù):{this.state.count}</div>
            <button>add</button>
        </>
    );
}

到此這篇關(guān)于關(guān)于React中setState同步或異步問題的理解的文章就介紹到這了,更多相關(guān)React中setState同步或異步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React?component.forceUpdate()強(qiáng)制重新渲染方式

    React?component.forceUpdate()強(qiáng)制重新渲染方式

    這篇文章主要介紹了React?component.forceUpdate()強(qiáng)制重新渲染方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React?之最小堆min?heap圖文詳解

    React?之最小堆min?heap圖文詳解

    這篇文章主要為大家介紹了React?之最小堆min?heap圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React生命周期原理與用法踩坑筆記

    React生命周期原理與用法踩坑筆記

    這篇文章主要介紹了React生命周期原理與用法,結(jié)合實(shí)例形式總結(jié)分析了react生命周期原理、用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • React?中state與props更新深入解析

    React?中state與props更新深入解析

    這篇文章主要為大家介紹了React?中state與props更新深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 詳解React-Todos入門例子

    詳解React-Todos入門例子

    本篇文章主要介紹了React-Todos入門例子,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    react 可拖拽進(jìn)度條的實(shí)現(xiàn)

    本文主要介紹了react 可拖拽進(jìn)度條的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • react實(shí)現(xiàn)自定義拖拽hook

    react實(shí)現(xiàn)自定義拖拽hook

    這篇文章主要為大家詳細(xì)介紹了react實(shí)現(xiàn)自定義拖拽hook,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React Native之prop-types進(jìn)行屬性確認(rèn)詳解

    React Native之prop-types進(jìn)行屬性確認(rèn)詳解

    本篇文章主要介紹了React Native之prop-types進(jìn)行屬性確認(rèn)詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Remix?路由模塊輸出對(duì)象handle函數(shù)

    Remix?路由模塊輸出對(duì)象handle函數(shù)

    這篇文章主要為大家介紹了Remix?路由模塊輸出對(duì)象handle函數(shù)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • React?Hook實(shí)現(xiàn)對(duì)話框組件

    React?Hook實(shí)現(xiàn)對(duì)話框組件

    這篇文章主要為大家詳細(xì)介紹了React?Hook實(shí)現(xiàn)對(duì)話框組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評(píng)論

淳安县| 荃湾区| 安阳市| 临猗县| 建宁县| 广德县| 霍邱县| 二连浩特市| 崇明县| 枣强县| 巧家县| 浠水县| 孙吴县| 霍城县| 四川省| 平罗县| 安乡县| 乌兰浩特市| 锦州市| 蒙自县| 耿马| 山东| 宁明县| 榕江县| 灌阳县| 黑龙江省| 张北县| 凤翔县| 泾川县| 梁山县| 黎城县| 奉节县| 集贤县| 镇雄县| 阳西县| 临西县| 丰顺县| 德格县| 鄂托克前旗| 梓潼县| 吐鲁番市|